路由参数传递
当我们访问浏览器的时候,经常通过固定的地址访问固定的视图界面。但难免的,我们希望通过浏览器传递不同的参数到后端,来达到通过参数路由分发到不同的视图界面,或者希望视图界面通过参数过滤以返回特定的数据呈现给我们的目的。那么,Django是怎么实现参数传递的呢?
无参数传递
静态路由,无需参数传递。
urls.py :
path('hello/', views.hello_view)
views.py :
def hello_view(request):
...
静态参数绑定
urls.py :
path('hello/', views.hello_view, {'name': 'test'})
views.py :
def hello_view(request, name):
...
请注意,path函数里传递的参数字典里的key必须在视图函数里存在且匹配
路径转换器传参
urls.py :
path('articles/<int:year>/<int:month>/', views.month_archive)
views.py :
def month_archive(request, year, month):
...
- 参数以<>匹配。
- 参数按照路径转换器中的命名传递,可以不按照顺序排列。
正则表达式传参
命名分组传参
urls.py :
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive)
views.py :
def month_archive(request, year, month):
...
- 参数以()匹配。
- 参数按照正则表达式中的命名传递,可以不按照顺序排列。
未命名分组传参
urls.py :
re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive)
views.py :
def month_archive(request, year, month):
...
- 参数以()匹配。
- 参数按照正则表达式中的顺序传递。
请求传参
request
对象
- 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象
- 视图函数的第一个参数是HttpRequest对象,即
def month_archive(request, year, month)
中的request - 在django.http模块中定义了HttpRequest对象的API
属性
path
:一个字符串,表示请求的页面的完整路径,不包含域名和请求参数method
:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'GET
:一个类似于字典QueryDict的对象,包含get请求方式的所有参数POST
: 一个类似于字典QueryDict的对象,包含post请求方式的所有参数COOKIES
: 一个标准的Python字典,包含所有的cookie,键和值都为字符串 用于状态保持(会话都是无状态的)session
: 一个既可读又可写的类似于字典的对象,表示当前的会话,用于会话状态保持
QueryDict
- 类似python字典,只不过是一键多值
- 方法get():
- 只能获取键的一个值
- 如果一个键同时拥有多个值,获取最后一个值
- 方法getlist()
- 将键的值以列表返回,可以获取一个键的多个值
- 只有一个值也为列表
POST
- 包含post请求方式的所有参数
- 与form表单中的控件对应, form 标签属性method 为post, 控件要有name属性,name 属性的值为键,value属性的值为值,构成键值对
GET
- 包含get请求方式的所有参数
- 与url请求地址中的参数对应,位于?后面
- 参数的格式是键值对,如key1=value1
- 多个参数之间,使用&连接,如key1=value1&key2=value2
- get方式请求内容现实在网页上相对post不安全
GET请求传参
- 通过网址输入参数传递:https://127.0.0.1:8000/articles?year=2017&month=12/
修改代码
urls.py : path('articles/', views.month_archive) views.py : def month_archive(request): year = request.GET.get('year', 'default_year') month = request.GET.get('month', 'default_month')
- 视图函数通过
request.GET.get()
函数获取参数
POST请求传参
- 通过表单空间或者ajax传递键值对参数
修改代码
urls.py : path('articles/', views.month_archive) views.py : def month_archive(request): year = request.POST.get('year', 'default_year') month = request.POST.get('month', 'default_month')
- 视图函数通过
request.POST.get()
函数获取参数