ORM创建外键
一对多 Foreignkey(to='创建外键关联的表名',to_field='这个是外键关联的字段')to_field如果不填的话,默认是将关联的表的主键作为关联的外键字段 多对多 ManyToManyField(to=..) 这个不会创建外键字段,仅仅是告诉django帮我们生成多对多关系的第三张表。 一对一 OneToOneField(to=..)这个是一对一的和一对多一样 补充:一对多和多对一会在外键字段创建完成后给外键字段加个_id后缀。
Django请求生命周期看图
路由层:
路由匹配规律:
url()方法,第一个参数其实是一个正则表达式。
一旦前面的正则表达式匹配到了内容,便不会继续匹配下去,而是去执行相对应的视图函数
正是因为有这种特性,当你的项目特别大的时候,url的前后要注意,不然会出现url错乱的问题。
url(r"^$")这个是匹配网站首页的url,url(r'')这个是匹配url不存在的时候。
django在匹配路由的时候,当你在浏览器没有敲最后的斜杠的时候,其第一次过来后端识别不了,让其加个斜杠再过来试试,第二次加了斜杠再来的时候,成功识别,就将数据成功返回了,如果想取消这个斜杠机制的话,就要在settings这个配置文件里面写APPEND_SLASH = False 默认是True,改False就ok,就取消斜杠的机制了。
无名分组:
url(r'test/(\d+)/',views.test),这个就是一个无名分组,就是将括号内正则表达式匹配到的内容当作位置参数传递给相应的视图函数。 test(request,2019)
有名分组
url(r'^test/(?P<正则表达式匹配到的内容起的名字>\d+)/', views.test) 就是把括号内正则表达式匹配到的内容当作一个关键字参数传递给对应的视图函数。 test(request,year=2019)
注意:无名分组和有名分组不能混合使用,但可以一种连续使用。
反向解析:
就是通过名字动态获取对应的路径
本质:就是给你返回一个能够返回对应的url地址
操作:
1.先给url和视图函数对应关系起别名
url(r'^index/$',views.index,name='kkk')
2.反向解析
后端反向解析:
后端可以在任何位置通过reverse这个模块获取相对应的url。
from django.shortcuts import render,HttpResponse,redirect,reverse reverse('起的别名')
前端反向解析:
前端要用到模板语法
{% url '别名' %}
无名分组反向解析
url(r'^index/(\d+)/$',views.index,name='kkk')
后端反向解析:
reverse('别名',args=(1,)) #后面的这个args通常是数据的id值
前端反向解析:
{% url '别名' 1 %} # 后面的值通常都是数据的id值
有名分组反向解析:
url(r'^index/(?P<year>\d+)/$',views.index,name='kkk') 后端反向解析: reverse('别名',kwargs={'year': 1}) 或reverse('kkk',args=(1,))#推荐这一种方便 前端反向解析: {% url '别名' year=10 %}或{% url '别名' 10 %}推荐这个
那么有名分组反向解析方法和无名分组方法一样,为了就是减少你的脑容量。
注意:同一个应用下,别名千万不要重复。
路由分发:
当你的项目特别大的时候,路由与视图函数对应关系越来越多的时候,全部放在总路由urls.py这个文件的时候,会造成代码冗余。 这个时候我就应该让我的每一个app都可以拥有自己的urls.py,static,template文件夹。这样我的总路由就不做路由匹配 ,只做一个引路人。 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^app01/',include('app01.urls')), url(r'^app02/',include('app02.urls')), ] 通过include这个模块里面直接指定app的urls文件,当输入app01,我进app01的urls,这样我总路由的压力就会减少很多,因为只做分配,不做匹配。
名称空间
当我的多个app起了相同的别名,这个时候用反向解析就没有用了,这个时候就需要指定一个namespace参数,是来自哪个app的
总路由 url(r'^app01/',include('app01.urls',namespace='app01')) url(r'^app02/',include('app02.urls',namespace='app02')) 后端解析的时候 reverse('app01:index') reverse('app02:index') 前端解析的时候 {% url 'app01:index' %} {% url 'app02:index' %}
方式2:
就不要起相同的别名就ok啦
伪静态:
静态:就是写死的,万年不变的
伪静态网页的设计就是为了增加搜索引擎的查询力度。
所有的搜索引擎其实就是一个庞大的爬虫程序。
网站优化相关,通过伪静态可以让你的网站被查询力度提高,比如加个后缀.html但其实不是静态就是伪装的。
虚拟环境
就是为每个项目量身定做的解释器环境
每开启一个虚拟环境,都等于下了一遍python解释器,也是耗资源的。
Django版本的区别(1.x和2.x)
路由层1.x用的是url
2.x用的是path
2.xpath里面的第一个参数不是正则表达式,而是写什么就匹配什么,精准匹配。
当然2.x里面也有一个re_path也可以匹配正则表达式
虽然2.X中path不支持正则表达式 但是它提供了五种默认的转换器: 1.x的url和2.x的re_path匹配出来的都是字符串 其有5种转换器 1.str,匹配除路径分隔符(/)以外的非空字符串,默认就是 2.int ,匹配正整数,包括0 3.slug,匹配字母,数字,横线,下划线组成的字符串 4uuid,匹配格式化的uuid,比如075194d3-6885-417e-a8a8-6c931e272f00 5path,匹配任意非空字符串,包含了路径分隔符(/),但不能用(?)
path('index/<int:id>/',index) # 会将id匹配到的内容自动转换成整型
还支持自定义转换器
class FourDigitYearConverter: regex = '[0-9]{4}' def to_python(self, value): return int(value) def to_url(self, value): return '%04d' % value 占四位,不够用0填满,超了则就按超了的位数来! register_converter(FourDigitYearConverter, 'yyyy') urlpatterns = [ path('articles/2003/', views.special_case_2003), path('articles/<yyyy:year>/', views.year_archive), ... ]
视图层
diango视图函数必须会返回一个HttpResponse对象
前后端分离
名字的意思:就是前端一个人干,后端一个人干,那么这个数据传输就要用到json来传输。
前端是转自定义对象
前端的json.stringify() 等于后端的json.dumps()
json.parse()等于后端的json.loads()
后端只负责生产接口,前端通过这个接口与获取一个大字典,
后端只需要写一个接口文档,里面描述字典的详细信息以及参数的传递
JsonResponse这个模块
rom django.http import JsonResponse def index(request): data = {'name':'jason好帅哦 我好喜欢','password':123} l = [1,2,3,4,5,6,7,8] # res = json.dumps(data,ensure_ascii=False) # return HttpResponse(res) # return JsonResponse(data,json_dumps_params={'ensure_ascii':False}) return JsonResponse(l,safe=False) # 如果返回的不是字典 只需要修改safe参数为false即可
上传文件
form表单上传文件需注意的
1.将enctype默认的编码格式urlencode改成formdata
2.将form表单默认的get请求,改成post请求。
目前还需要考虑的是 提交post请求需要将配置文件中的csrf中间件注释
如果form表单上传文件 后端需要在request.FILES获取文件数据 而不再是POST里面
request.method request.GET request.POST request.FILES request.path # 只回去url后缀 不获取?后面的参数 request.get_full_path() # 后缀和参数全部获取
request.body 获取二进制数据
RBAC基于角色的权限管理
path和get_full_path就是给权限的管理,权限等于url,判断用户输入的url符合其可以访问的url