路由层html
urlpatterns = [ url(r'^admin/',admin.site.urls), url(r'test',view.test), url(r'testadd',views.testadd), ] 路由一旦匹配就不会在往下匹配了 路由增长首页的方式 url(r'^$',views.home) 路由增长尾页的方式(当全部的路径都匹配不上时,返回404界面) url(r'',views.error)
无名分组前端
url(r'^test/(\d+{4})',views.test)python
会将括号中的正则表达式匹配的内容看成位置参数传递给后面的视图函数正则表达式
有名分组django
url(r'^test/(?<year>\d+{4})',views.test)json
会将括号内的正则表达式匹配的内容看成关键字参数传递给后面的视图函数后端
有名分组和无名分组不能混合使用,只要不混合使用,有名分组,无名分组支持多个值传参浏览器
反向解析 app
前端反向解析 {% url 'add' %} add = urls.py中路由与视图函数的name的值 后端反向解析 from django.shortcuts import reverse url(r'^testadd/$',views.testadd,name='add') res = reverse("add")
无名分组的反向解析
前端反向解析
{% url 'add' 参数 %}
后端反向解析
from django.shortcuts import reverse
url(r'^testadd/(\d+)/$',views.testadd,name='add')
res = reverse('add',args=(值,))
有名分组反向解析
前端反向解析
{% url 'add' year %}
<a href="{% url 'add' year %}"></a>
后端反向解析
res = reverse('add',args=(值,))
res = reverse('add',kwargs={"year":1})
路由分发函数
总路由再也不直接作路由与视图函数的对应关系,而是将获取的路由分发给下面的app去处理对应关系
每个app下均可以新建本身的urls.py文件
总路由中:
from django.conf.urls import include
url(r'^app01/',include(app01_urls))
子路由总安装总路由中的写法,匹配视图函数
名称空间
能够给incclude中的app命名一个名称空间
url(r'^app01/',include(app01_urls, namespace='app01'))
伪静态
伪装本身的路径是一个静态文件的路径,其实文件名是经过视图函数处理的,内容仍是动态添加
虚拟环境
每一个项目用到的模块不同,为了让每个项目都有仅仅属于本身的解释器
使用:新建项目的时候选择虚拟环境建立解释器
勾上Make available to all projects表示你建立的虚拟环境九年被其余新项目使用
django2.0和django1.0的区别
1.0中的url对应2.0里的re_path
2.0中的path第一个参数是精准匹配
2.0中的转换器
1.0版本的url和2.0版本的re_path分组出来的数据都是字符串类型
str,匹配除了路径分隔符(/)以外的非空字符串,这是默认的形式
int,匹配正整数,包含0
slug,匹配字母、数字以及横杠、下划线组成的字符串
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
自定义转换器 class MyCon:
regex = '[0-9]{4}'
def to_python(self,value):
return int(value)
def to_url(self,value):
return '%04d' % value
from django.urls import register_converter
register_converter(MyCon,'yyyy')
path('test/<yyy:year>', views.re_test,name='test')
当APPEND_SLASH=False 浏览器不会自动增长反斜杠
视图层(view.py)
HttpResponse >>> 返回字符串
render >>> 支持模板语法,渲染页面,并返回给前端
redirect >>> 重定向
上面的方法返回的都是HttpResponse对象
JsonResponse >>> 返回json格式的数据
FBV和CBV
FBV:基于函数的视图
CBV:基于类的视图
from django.views import View class Login(View):
def get(self,request):
return render(request,'login.html')
def post(self,request):
return HttpResponse('post')
文件上传
前端注意
form表单method必须是post,enctype必须是multipart/form-data
后端接收
def upload(request):
if request == 'POST':
file_obj = request.FILES.get('myfile')
file_name = file_obj.name
with open(file_name,'wb') as f:
for line in file_obj.chunks():
f.write(line)
return render(request,'upload.html')
前台Post传过来的数据,包装在POST字典中 request.POST 前台浏览器窗口携带的数据,包装在GET字典中 request.GET 前台请求方式 request.method post提交的数据,body体中的内容,前台会分装成name=lqz&age=18 request.body 取出路径 request.path 取出路径和数据 request.get_full_path() 请求头中的键值对 request.META