正则路径中的分组
无名分组
分组的概念:就是给某一段正则表达式用小括号括起来
无名分组按位置传参数,一一对应。
view中除去request,其他形参数量要与urls中分组数量一致。
无名分组就是将括号内匹配到的内容当作位置参数传递给后面的视图函数
urls.py:
urlpatterns = [
url(r'^test/([0-9]{4})', views.test)]
views.py
from django.shortcuts import HttpResponse
def index(request,year):
print(year) # 一个形参代表路径中一个分组的内容,按顺序匹配
return HttpResponse('kkk')
有名分组
有名分组按关键字传参,与位置顺序无关。
views 中除了 request,其他形参的数量要与 urls 中的分组数量一致, 并且 views 中的形参名称要与 urls 中的组名对应。
(?P<组名>正则表达式)
# 有名分组相当于给正则表达式取了别名
urlpatterns = [
url(r'^test/([0-9]{4})', views.test)]
from django.shortcuts import HttpResponse
def index(request,year):
print(year) # 形参和分组名要一致
return HttpResponse('kkk')
有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数,需要注意的是有名无名不可以混用
反向解析
随着功能的增加,路由层的 url 发生变化,就需要去更改对应的视图层和模板层的 url,非常麻烦,不便维护。
这时我们可以利用反向解析,当路由层 url 发生改变,在视图层和模板层动态反向解析出更改后的 url,免去修改的操作。
反向解析一般用在模板中的超链接及视图中的重定向。
# 在urls.py 中给路由起别名
url(r'^hub_login/', views.login, name='login2')
def login():
return HttpResponse('login')
# 后端反向解析
# 在views.py 导入reverse模块
res = reverse('login2')
print(res)
# 可以动态获取url路径
# 前端反向解析
<a href="{% url 'login2' %}">登录</a>
# 这时候无论路径怎么改,html页面的路径都会动态更新
有名分组无名分组反向解析
# 无名分组反向解析
url(r'^index/(\d+)/', views.index, name = 'xxx')
# 前端
{% url 'xxx' 123 %}
# 后端
reverse('xxx', args=(1,))
# 数字一般情况下放的是数据的主键值 数据的编辑和删除
# 有名分组反向解析
url(r'^index/?<year>P(\d+)/', views.index, name = 'xxx')
<a href="{% url 'xxx' 123 %}"</a>
print(reverse('xxx',kwargs={'year':123}))
# 简便写法
print(reverse('xxx',args=(123,)))
路由分发
Django 的每一个应用都可以有自己的templates文件夹、urls.py static文件夹,正是基于上述特点,能够做到分组开发。当所有url都放在一个url里面会造成冗余不好维护。利用路由分发,总路由识别当前url是属于哪个应用下的,直接分发给对应的应用去处理。
import include
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls'))
JsonResponse对象
from dajango.http import JsonResponse
def test(request):
d1 = {'kk': '你懂', 'dqin': '今晚你的节目'}
res = JsonResponse(d1, json_dumps_params={'ensure_ascii': False})
return HttpResponse(res)
如果传入的不是字典还应该加上 safe=False
FBV与CBV
视图函数既可以是函数也可以是类,FBV:function base view,CBV:class base view,CBV会根据请求方式不同匹配到对应的方法执行。
from django.views import View
# CBV必须继承View
class Mylogin():
http_methods_name = ['get', 'post'] # 这样可以限制请求方式 有限查找内部方法
def get(self, request):
return HttpResponse('get')
def post(self, request):
return HttpResponse('post')
# 路由书写方法
url(r'^login/', views.MyLogin.as_View())
request对象中的方法补充
request.FILES # 可以获取到上传的文件数据
request.FILES.get('文件名') # 可以将它取出
request.path # 获取到对应的路由
request.get_full_path() # 获取到对应路由和后面的参数
# 上传文件必须做的两件事:
1、请求方式改成post
2、改enctype=multipart/form-data