zoukankan      html  css  js  c++  java
  • Django复习

    django复习

    django和其他框架的对比

    django,集成很多功能的大型框架,为开发者提供了很多方便的组件:orm、form、ModelForm、auth、admin、contenttypes、模板引擎、session、缓存、分页
    flask,轻量级的框架、自己的功能少,但是可扩展强有强大的第三方组件的支持。
    tornado
         - 异步非阻塞框架(自己写socket,可以不使用第三方wsgi)
         - 自带websocket

    django请求生命周期

        1.wsgi,请求封装后交给web框架 (Flask、Django)     
        2.中间件,对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session     - 
        3.路由匹配 根据浏览器发送的不同url去匹配不同的视图函数    
        4.视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染     - 
        5.中间件,对响应的数据进行处理。 
        6.wsgi,将响应的内容发送给浏览器。

    什么是wsgi

    web服务网管接口,他是一个协议。实现一些的模块:wsgiref、uwsgi、werkzeug
    本质:socket服务端

    源码分析:

    复制代码
       from wsgiref.simple_server import make_server
    
    </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> run_server(environ, start_response):
        start_response(</span><span style="color: #800000;">'</span><span style="color: #800000;">200 OK</span><span style="color: #800000;">'</span>, [(<span style="color: #800000;">'</span><span style="color: #800000;">Content-Type</span><span style="color: #800000;">'</span>, <span style="color: #800000;">'</span><span style="color: #800000;">text/html</span><span style="color: #800000;">'</span><span style="color: #000000;">)])
        </span><span style="color: #0000ff;">return</span> [bytes(<span style="color: #800000;">'</span><span style="color: #800000;">&lt;h1&gt;Hello, web!&lt;/h1&gt;</span><span style="color: #800000;">'</span>, encoding=<span style="color: #800000;">'</span><span style="color: #800000;">utf-8</span><span style="color: #800000;">'</span><span style="color: #000000;">), ]
    
    </span><span style="color: #0000ff;">if</span> <span style="color: #800080;">__name__</span> == <span style="color: #800000;">'</span><span style="color: #800000;">__main__</span><span style="color: #800000;">'</span><span style="color: #000000;">:
        httpd </span>= make_server(<span style="color: #800000;">'</span><span style="color: #800000;">127.0.0.1</span><span style="color: #800000;">'</span>, 8000<span style="color: #000000;">, run_server)
        </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Serving HTTP on port 8000...</span><span style="color: #800000;">"</span><span style="color: #000000;">)
        httpd.serve_forever()</span></pre>
    
    复制代码

    中间件

    五大中间件:
    process_request(self,request)
    process_view(self, request, view_func, view_args, view_kwargs)
    process_template_response(self,request,response)
    process_exception(self, request, exception)
    process_response(self, request, response)
    以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。
    执行流程:process_request请求进来走到视图process_view,执行完函数之后process_response响应。如果有模板渲染就走process_template_response,然后再走response响应。如果有错误,就走process_exception,返回错误信息,然后走process_response响应
    - 应用场景:
            - 权限认证
            - CORS跨域
            - csrftoken认证
            - session原理实现

    路由系统

        - url正则
        - 别名
        - namespace
        - include路由分发
        - 反向生成URL

    视图

    复制代码
        - FBV & CBV
        - request对象
            request.GET
            request.POST.get()
            request.POST.getlist()
    
        request.body,原始的请求体数据。
        request.POST, 将原始的请求体数据转换成QueryDict对象。
            </span>- content-type: application/x-www-form-<span style="color: #000000;">urlencoded
            </span>- 请求体的格式:phone=8615131255555&amp;password=asdfadfasdf&amp;oneMonth=1</pre>
    
    复制代码

    什么是ORM?

    对象关系映射。
            类    ->  表
            对象  ->  行
    以后通过类和对象的操作可以直接反应到数据。         

    django orm

    复制代码
    a. 查询 id != 5
            models.User.objects.exclude(id=5)
    b. 查询 name != null(left join )
            models.User.objects.filter(name__isnull=False)
    c. 使用数据库
            models.User.objects.filter(name__isnull=False).using('db1')
    d. 如何执行原生SQL?
           extra
                models.UserInfo.objects.extra(where=['headline=%s'], params=['Lennon'])
                models.UserInfo.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
    
            select 
                id,
                name,
                select count(</span>1) <span style="color: #0000ff;">from</span><span style="color: #000000;"> tb2 as count 
                select col </span><span style="color: #0000ff;">from</span> sometable where othercol &gt; %<span style="color: #000000;">s as new_id 
            </span><span style="color: #0000ff;">from</span><span style="color: #000000;"> tb;
            
            Entry.objects.extra(select</span>={<span style="color: #800000;">'</span><span style="color: #800000;">new_id</span><span style="color: #800000;">'</span>: <span style="color: #800000;">"</span><span style="color: #800000;">select col from sometable where othercol &gt; %s</span><span style="color: #800000;">"</span>}, select_params=(1<span style="color: #000000;">,))
            Entry.objects.extra(select</span>={<span style="color: #800000;">'</span><span style="color: #800000;">new_id</span><span style="color: #800000;">'</span>: <span style="color: #800000;">"</span><span style="color: #800000;">select id from tb where id &gt; %s</span><span style="color: #800000;">"</span>}, select_params=(1,), order_by=[<span style="color: #800000;">'</span><span style="color: #800000;">-nid</span><span style="color: #800000;">'</span><span style="color: #000000;">])
        raw
            models.UserInfo.objects.raw(</span><span style="color: #800000;">'</span><span style="color: #800000;">select * from userinfo</span><span style="color: #800000;">'</span><span style="color: #000000;">)
        connection
            </span><span style="color: #0000ff;">from</span> django.db <span style="color: #0000ff;">import</span><span style="color: #000000;"> connection, connections
            cursor </span>= connection.cursor()  <span style="color: #008000;">#</span><span style="color: #008000;"> cursor = connections['default'].cursor()</span>
            cursor.execute(<span style="color: #800000;">"</span><span style="color: #800000;">SELECT * from auth_user where id = %s</span><span style="color: #800000;">"</span>, [1<span style="color: #000000;">])
            row </span>= cursor.fetchone()</pre>
    
    e. select_related & prefetch_related
      
      # SQL次数:1+5次单表查询
    # select * from userinfo
    user_list = models.UserInfo.objects.all()
    for item in user_list:
    print(item.id,item.name,item.depart_id, item.depart.title ) # 1 * 5

      # SQL次数:1次连表查询
    # select * from userinfo inner join xx.....
    user_list = models.UserInfo.objects.all().select_related('depart','业务线')
    for item in user_list:
    print(item.id,item.name,item.depart_id, item.depart.title )

      # SQL次数:2次单表查询
    # select * from userinfo; [1,]
    # select * from depart where i in [1,]
    # select * from 业务线 where i in [2,3,]
    user_list = models.UserInfo.objects.all().prefetch_related('depart','业务线')
    for item in user_list:
    print(item.id,item.name,item.depart_id, item.depart.title )
    f. F & Q 
    F,用于利用数据库已有的字段数据。
    Q,构造复杂的SQL条件。
    复制代码

    模板

    复制代码
        a. 引入静态文件
            <img src="/static/1.png" alt="">
    
        {</span>% load staticfiles %<span style="color: #000000;">}
        </span>&lt;img src=<span style="color: #800000;">"</span><span style="color: #800000;">{% static 'img/1.png' %}</span><span style="color: #800000;">"</span> alt=<span style="color: #800000;">""</span>&gt;<span style="color: #000000;">
    
    b. 模板文件的查找顺序
        优先找根目录下的templates </span>&gt;<span style="color: #000000;"> 根据app的注册顺序去每个app的templates中查找。 (静态文件)
    
    c. 模板的自定义方法
        </span>-<span style="color: #000000;"> simple_tag,无参数限制,一般用于返回一个值。
        </span>-<span style="color: #000000;"> inclusion_tag,无参数限制,一般用于返回一个HTML代码块。
        </span>- filter,有参数限制,一般用于返回一个值。特别的:可以在 {% <span style="color: #0000ff;">if</span> 后面条件 %}</pre>
    
    复制代码

    Form & ModelForm

    表单验证 & 数据库操作

    admin & stark

    详细参见demo

    contenttypes

    详细参见demo
  • 相关阅读:
    C++ Primer读书笔记
    谨慎使用多线程中的fork
    C++中多线程与Singleton的那些事儿
    浅谈指针的比较
    条件变量的陷阱与思考
    2014年终总结
    循环队列的一种实现模型
    react-native使用jest、enzyme进行单元测试
    富文本编辑器开发原理
    模拟实现单元测试中的异步测试
  • 原文地址:https://www.cnblogs.com/djfboai/p/10032750.html
Copyright © 2011-2022 走看看