路由层
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)
会将括号中的正则表达式匹配的内容当作位置参数传递给后面的视图函数
有名分组
url(r'^test/(?<year>d+{4})',views.test)
会将括号内的正则表达式匹配的内容当作关键字参数传递给后面的视图函数
有名分组和无名分组不能混合使用,只要不混合使用,有名分组,无名分组支持多个值传参
反向解析
前端反向解析 {% 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