$Django 客户端->wsgi->中间组件->urls->views(model,template) 总结+补充!

1 HTTP协议:(重点)
  -请求
   -请求首行
    -GET /index HTTP/1.1 \r\n
   -请求头部
    -key:value------>\r\n分割
    _key2:value------>\r\n\r\n
   -请求体(post请求发的数据) 
   -往后台传数据的时候,有编码方式(urlencoded,form-data,json/text)
    -默认urlencoded---->name=lqz&name=18---->从POST中取出
    -form-data---上传文件,数据在body体中的格式---->也从POST中取出
    -json---->从POST中取不出来,只能从body中取出,然后反序列化
  -响应
   -响应首行(用空格区分)
    -HTTP/1.1 200 OK \r\n    
   -响应头
    -key:value \r\n\r\n
   -响应体
    -html/css/js代码
 2 web框架
  -django:大而全
  -flask:轻量级,第三方的插件
  -tornado:异步非阻塞
  -wsgi:Web Server Gateway Interface web服务网关接口---是一个协议
  -django测试阶段用的:wsgiref
   import socket
   def server_run():
    soc = socket.socket()
    soc.bind(('127.0.0.1', 8008))
    soc.listen(5)
    while True:
     conn, addr = soc.accept()
     recv_data = conn.recv(1024)
     
     ----->django框架
     路由层
     模板层
     模型层
     
     conn.send(('HTTP/1.1 200 OK\r\n\r\n%s'%data).encode('utf-8'))
     conn.close()
 3 django框架所在位置:
  from wsgiref.simple_server import make_server
  def mya(environ, start_response):
   # print(environ)
   start_response('200 OK', [('Content-Type', 'text/html')])
    
   return [b'404']
  class Test():
   pass
  test=Test()
  if __name__ == '__main__':
   myserver = make_server('127.0.0.1', 8011, test)
   print('监听8010')
   myserver.serve_forever()
   
 4 django简介
  -pip3 install django==1.11.09 -i 指定国内源
  -安装成功后,会在script文件夹下多django-admin.exe
  -用来创建django项目
  -django-admin startproject 项目名字(到指定文件夹下)
  -cd到项目目录下,可以创建app,可以运行项目,可以数据库迁移
  -创建app:python3 manage.py startapp app的名字
  -运行项目app:python3 manage.py runserver
  -数据库迁移1:python3 manage.py makemigrations
  -数据库迁移2:python3 manage.py migrate
  
  
 5 mvc和mtv
  -django 是mtv模式:
   -M:model   ---->模型
   -T:Template  --->模板
   -V:view    ---->视图
  -mvc模式:
   -M:model---->模型,数据库相关
   -v:view----->模板---->页面相关
   -C:controller--->控制器:url+view
  本质上:MTV就是MVC
   
 6 Django请求生命周期
  详见博客
 7 路由层
  一 Django中路由的作用
   -根据客户请求的路径,分发到不同的视图函数
  二 简单的路由配置
   -url('正则',函数,默认值,name)
   url(r'^author_update/', author.author_update,{'id':1}),
  三 有名分组,无名分组
   -利用正则分组:
    -有名分组:(?P<名字>\d+),分出的名字,会以关键字参数的形式,传到视图函数
    -无名分组:(\d+)分出的名字,会以位置参数的形式,传到视图函数
   
  四 路由分发
   - url(r'^author_update/', include('子路由的路径')),
   -可以传子路由的路径字符串----推荐这种
   -可以传子路由的py文件

 -本质:传了个py文件

  五 反向解析
   -url(r'^author_update/', author.author_update,name='test'),
   -视图函数重定向,或者模板中写死了路径
   -可以用反向解析来动态生成路径
   -视图层:(有参数)
    -url=reverse('test',args=(参数一,参数二,))
   -模板层:(有参数)
    {%url 'test' 参数一 参数二%}
  六 名称空间
   -路径重命名,可能会重复,反向解析,就会出问题
   -指定名称空间
   -url(r'^author_update/',include('子路由路径',namespace='app01')),
   -reverse('app01:test')
  七 django2.0版的path
   -re_path根url一样
   -path是准确路径
   -5个转换器:int,str,slug,path,uuid
   -自定义转换器
    class Test:
     regex='正则'
     def to_python(self,value):
      逻辑处理
      return value
     def to_url(self,value)
      return '%04d'%value
   -使用:
    -register_converter(converters.FourDigitYearConverter, 'yyyy')
    -<yyy:year>
  八 伪静态:.html
 8 视图层
  -请求
   -request对象:POST,GET(post提交数据,浏览器地址栏,也可以携带参数),method(大写),body(post提交的所有数据),path(路径),get_full_paht()-->(全路径,包含数据),FILES(前台传过来的文件,它是一个字典),META
  -响应:
   -render,HttpResponse,redirect
   -JsonResponse-->往前台返回一个json格式数据(本质:继承了HttpResponse,封装了json)
   -不能转换列表,想转换,safe=False
   -编码方式
  -cbv和fbv
   基于类的视图
    -路由:url(r'^test/', views.Test.as_view()),
    -视图:

     from app01.views import View
     class Test(View):
      def dispatch(self, request, *args, **kwargs):
       # 加点东西
       # request=request.POST
       response=super().dispatch(request, *args, **kwargs)
       # 加点东西
       return response
      def get(self,request):
       return HttpResponse('get')
   基于函数的视图
        
 9 模版层
  一 模版简介
   渲染页面
  二 模版语法之变量
   -{{ 变量 }}
   -{{深度查询用.}}
  三 模版之过滤器(最多2参数)
   -自带过滤器
    {{ 参数|过滤器名字:参数 }}
    -date
    -add
    -length
    -upper
    -lower
   -可以自定义过滤器
  四 模版之标签(都要有结束)
   -{% for %}
    -循环字典:(在模板里,方法不能加括号)
     {% for key,value in 字典.items%}
    -forloop对象:parentloop,last,first,count,count0,revcountcount,revcount0
   -{% if %}
    -跟python if判断一样
    -可以嵌套在for循环中
    -{% elif%}
    -{% else%}
   -{% with%}
    -重命名
  五 自定义标签和过滤器
   -先注册app
   -在app下创建一个templatetags的文件夹
   -在模块下新建一个py文件
   -from django.template import Library
   -register=Library()------>名字必须叫register
   -标签:
    -用装饰器装饰 @register.simple_tag
   -过滤器
    -用装饰器装饰 @register.filter
   -过滤器最多只能传两个参数,标签可以传多个
   -在模板中使用:
    -{% load py文件名%}
    -{{参数|自定义的过滤器:参数}}----->过滤器
    -{% 自定义的标签名 参数一 参数二 %}----->标签
  六 模版导入和继承
   -在模板中
    -{% include '1.html'%}----->不要再以html开头,结尾了
   -继承
    -写一个母版,留几个盒子
     -{%block name1%}
      {%endblock%}
    -其他模板继承该母版,扩写盒子
     {%extends 'base.html'%}
     {%block 名字%}
     写内容
     {%endblock%}
    -{% block.super %}--->可以显式盒子中原来有的东西
    -多个盒子,跟写的位置无关
  七 静态文件相关
   - 基本配置<link rel="stylesheet" href="/static/mycss.css">
   -static配置:
   -{%load static%}
   -<link rel="stylesheet" href="{% static 'mycss.css'%}">


   -{% load static %}
   -<link rel="stylesheet" href="{% get_static_prefix %}mycss.css">
   
  八 模型层
  -单表操作
   -增:两种方式,create,对象.save()
   -删:两种方式:queryset对象,对象都有delete()
   -修改:queryset对象的update方法,对象修改--->没有update,用对象的save()
   -查:
    -查询api
    -模糊查询:基于双下划线
  -多表操作
   -增加:
    一对一:authordetail=对象----authordetail_id=id
    一对多:可以传对象,可以传id
    多对多  对象来调的方法:
     -add(),remove(),
      -*args--可以传对象,可以传id
     -clear()清空所有
     -set(可迭代对象)
      -传一个可迭代对象内(可以传对象,可以传id)
   -删除:如果设置了级联删除,就会级联删除
   -查询
    -正向:关联字段在那个表,从哪个表往外查,是正向
    -反向:反过来
    -基于对象
     -正向按字段
     -反向
      -一对一 :表名小写
      -其他:表名小写_set
     -子查询,多条查询
    -基于双下划线
     -核心:__连表
     form django.db.models import Count,Avg,Sum,F,Q
     -聚合:Count,Sum,Max.... aggregate(Count(''))
     -分组查询的内容: value('id').annotate(Count('zuozhe')) .value('name') #前面value用来分组 默认是id 没写 annotate是查询分组后的Avg,Count等  后面的value表示取值
      -总结:
       value在前表示group by,在后,表示取值
       filter在前,表示where,在后,表示having
     -F函数,Q函数
      -F函数,因为等号后面不能传字段,所以用F函数包裹一下
      -Q函数:表示与&  或|   非~  关系
  -常用,非常用字段
   -常用的记住,非常用的知道
   -dateField类型:auto_now和auto_add_now
  常用参数:
   -级联删除:2.0以后,必须显示指定
   -唯一性
   -索引
  元信息:
   -重名名表名
   -联合索引
   -联合唯一


补充1【inclusion_tag】 
 -先注册app
 -在app下创建一个templatetags的模块
 -在模块下新建一个py文件
 -from django.template import Library
 -register=Library()------>名字必须叫register
 -使用装饰器:@register.inclusion_tag('test.html')
 -写个函数my_inclusion,返回字典
 -模板里就能取到字典,渲染模板
 @register.inclusion_tag('test.html')
 def ss(obj):
  print(obj)
  return {'lis':obj}
 test.html内可以拿到 lis
 -使用:在其他模板中:
  {%load py文件名%}
  {% my_inclusion 参数%}
补充2【(事务)】:
 from django.db import transaction
 with transaction.atomic():
  # 两条create
  pass
补充3【(choice)】:
 -在模型表中定义mychoice=((1,'男'),(2,'女'),(3,'其他'))
 -在字段上用:dd = models.IntegerField(choices=mychoice)
 -取对应的文字:
  -在视图层:(get_字段名_display())
   sex=author.get_dd_display()
   
补充4【defer和only(数据库优化)】
 only:只取我指定的字段,返回值是queryset里套对象,只是对象里只有指定的字段
 defer:反过来
    

猜你喜欢

转载自www.cnblogs.com/3sss-ss-s/p/9971162.html