路由可以定义在工程的目录下(看你的需求),也可以定义在各个应用中来保存应用的路由,用主路文件urls中使用include()包含各个应用的子路由的数据
路由的解析顺序
django接收到请求后,从主路由文件urlpatterns中的路由从上倒下顺序查找,如果有include包含,则进入子应用的urls中的urlpatterns中查找(从上而下)
路由的结尾斜线
django有/结尾路由,用户不需要加/,就可以直接重定向到/结尾的路径上
路由命名(可以避免不同应用使用相同名字发生冲突)
如:
1
2
3
4
5
6
7
8
9
|
# 主路由
from django.conf.urls import url,include
from django.contrib import admin
import django_test.urls
urlpatterns = [
url(r '^admin/' , admin.site.urls),
url(r '^users/' ,include(django_test.urls ,namespace = 'users' ))
]
|
reverser反解析(子应用的路由都需要命名)
注意点:
- 对于未指明namespace的,reverse(路由name)
- 对于指明namespace的,reverse(命名空间namespace:路由name)
请求(post,put,patch,delete)默认开启csrf防护
post请求那些需要到postman测试工具里面测试
先把csrf防护注释掉
向服务器传递参数的方式
url:直接在url中传递数据
查询字符串:key1=value1&key2=value2;
请求体:在body中传递数据,常见有表单,json,xml
请求头:在http报文头中
url参数传递
未定义参数顺序传递
子应用的路由设置
1
2
3
4
5
6
|
urlpatterns = [
# 这边定义子应用的路由
url(r '^index/$' ,views.index,name = 'index' ),
url(r '^show/$' ,views.show,name = 'show' ),
url(r '^parameter/([a-z]+)/(\d{4})$' ,views.parameter,name = 'parameter' ),
]
|
定义视图函数
1
2
3
4
5
6
|
# name,和age参数位置调换会影响下面的输出结果
def parameter(request,name, age):
print ( 'age=%s' % age)
print ( 'name=%s' % name)
return httpresponse( 'ok' )
|
命名参数按照名字传递
子路由
1
2
3
4
5
6
|
urlpatterns = [
# 这边定义子应用的路由
url(r '^index/$' ,views.index,name = 'index' ),
url(r '^show/$' ,views.show,name = 'show' ),
url(r '^parameter/(?p<name>[a-z]+)/(?p<age>\d{4})$' ,views.parameter,name = 'parameter' ),
]
|
视图函数
1
2
3
4
5
6
|
# age 和name位置改变值不变
def parameter(request,age, name):
print ( 'age=%s' % age)
print ( 'name=%s' % name)
return httpresponse( 'ok' )
|
查询字符串(传递参数)
注意:查询字符串不区分请求方式,即假使客户端进行post方式的请求,依然可以通过request.get获取请求中的查询字符串数据。
子路由
1
|
url(r '^qust/$' ,views.qust),
|
视图函数
1
2
3
4
5
6
7
8
|
def qust(request):
a = request.get.get( 'a' )
b = request.get.get( 'b' )
alist = request.get.getlist( 'a' )
print (a) # 3
print (b) # 2
print (alist) # ['1', '3']
return httpresponse( 'ok' )
|
运行(后面在加)
请求体(传递参数)
表单类
路由设置
1
|
url(r '^get_form/$' , views.get_form)
|
视图函数
1
2
3
4
5
6
7
8
|
def get_form(request):
name = request.post.get( 'name' )
age = request.post.get( 'age' )
alist = request.post.getlist( 'name' )
print (name)
print (age)
print (alist)
return httpresponse( 'ok' )
|
运行
非表单类
路由
1
|
url(r '^get_body_json/$' , views.get_body_json),
|
视图
1
2
3
4
5
6
7
|
def get_body_json(request):
json_str = request.body
json_str = json_str.decode() # python3.6 无需执行此步
req_data = json.loads(json_str)
print (req_data[ 'a' ])
print (req_data[ 'b' ])
return httpresponse( 'ok' )
|
运行
请求头(传递参数)
可以通过request.meta属性获取请求头headers的数据
路由
1
|
url(r '^get_head/$' , views.get_head)
|
视图函数
1
2
3
|
def get_head(request):
print (request.meta[ 'content_type' ])
return httpresponse( 'ok' )
|
运行
常见的请求头
content_length
– the length of the request body (as a string).
content_type
– the mime type of the request body.
http_accept
– acceptable content types for the response.
http_accept_encoding
– acceptable encodings for the response.
http_accept_language
– acceptable languages for the response.
http_host
– the http host header sent by the client.
http_referer
– the referring page, if any.
http_user_agent
– the client's user-agent string.
query_string
– the query string, as a single (unparsed) string.
remote_addr
– the ip address of the client.
remote_host
– the hostname of the client.
remote_user
– the user authenticated by the web server, if any.
request_method
– a string such as "get"
or "post"
.
server_name
– the hostname of the server.
server_port
– the port of the server (as a string).
响应
- httpresponse提供一系列子类
- httpresponseredirect 301
- httpresponsepermanentredirect 302
- httpresponsenotmodified 304
- httpresponsebadrequest 400
- httpresponsenotfound 404
- httpresponseforbidden 403
- httpresponsenotallowed 405
- httpresponsegone 410
- httpresponseservererror 500
案例 # httpresponse(content=响应体,content_type=响应数据类型,status=状态码)
1
2
3
4
5
6
7
|
# content:表示返回的内容
# status_code:返回的http响应状态码
# content_type: 指定返回数据的mime类型
from django_http import httpresponse
def index(request):
return httpresponse( '欢迎来到gaidy博客' , status = 202 )
|
jsonresponse(返回的json数据)
1
2
3
4
|
from django.http import jsonresponse
def index(request):
return jsonresponse({ 'name' : 'gaidy' , 'age' : '25' })
|
运行结果
redirect重定向
1
2
3
4
5
6
|
from django.shortcuts import redirect
# django_test是路由的空间命名
def show(request):
# 重定向
return redirect(reverse( 'django_test:index' ))
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/gaidy/p/9254788.html