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

Django复习的更多相关文章

  1. django复习笔记3:urls/views/templates三板斧

    0.先看看文件结构 mysite/ mysite/ ├── __pycache__ │   └── manage.cpython-.pyc ├── blog │   ├── __init__.py │ ...

  2. django复习笔记2:models

    关于models,主要想说的是django shell以及生成测试数据的脚本这两部分. 一个models中的类相当于数据库的一张表,先看一个设置了外键的models. from django.db i ...

  3. django复习笔记1:环境配置

    一.IDE 推荐使用sublime安装djaneiro插件. 1.安装方式 package control中搜索djaneiro 支持补全请参考:Django support for Sublime ...

  4. 中间件详解,Django复习

    day74 2018-05-21 课程安排周一: 中间件 auth模块+分析BBS项目需求(小组讨论把表结构设计出来) 1. 今日内容 中间件:http://www.cnblogs.com/liwen ...

  5. Django复习1

    django常用命令:http://www.cnblogs.com/ldq1996/p/7731930.html Django查询SQL语句: http://www.cnblogs.com/ldq19 ...

  6. Django复习2

    一.创建django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 其他常用命令: python man ...

  7. Django 复习

    Django 基础1 day49 老师的博客:https://www.cnblogs.com/yuanchenqi/articles/6083427.html http://www.cnblogs.c ...

  8. django复习-3-请求与响应

    一.请求request 前端向后端传递参数有几种方式? 提取URL的特定部分,如/weather/beijing/2018,可以在服务器端的路由中用正则表达式截取: "http://127. ...

  9. django复习-2-配置、静态文件与路由

    一.配置文件 1. BASE_DIR BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) __file__指当 ...

随机推荐

  1. MySql cmd下的学习笔记 —— 有关分组的操作(group by)

    (一) 把建立的goods表找到 (二) 当cat_id = 3时,计算所有商品的库存量之和 计算每个cat_id下的库存量(group by) 需要用到分组,把每个红框内的计算在一起 筛选出本店价比 ...

  2. MySQL报错解决方案:2013-Lost connection to MySQL server

    今天上课的时候,在搭建完MySQL测试环境中出现的问题,整理如下: 问题描述:搭建完MySQL,用远程连接工具(Navicat)连接时报错: 2013-Lost connection to MySQL ...

  3. WPF C# int.TryParse的用法

    ; if (!int.TryParse(item.Tag.ToString(), out comld)) { continue; } 没转换成功就continue 开始写成 if(GetNumber( ...

  4. sqlserver开窗函数在财务对账中的用法

    曾几何时发现开窗函数在财务对账总特别好用.但是每次可能很久没用,逻辑都要重头来过.特此留一份完整的思考逻辑待日后参考. 以下是数据源: 从上面的数据可以看到通过C列,那么只需要两个条件即可获得已经用对 ...

  5. CF1101G (Zero XOR Subset)-less

    题目地址:CF1101G (Zero XOR Subset)-less 线性基基础题 预处理一个前缀异或和 \(s_i\) 这样题目就变成了:在 \(n\) 个 \(s_i\) 中尽量选择多的数使选择 ...

  6. 20165231 预备作业二:学习基础和C语言基础调查

    微信文章感想 读了娄老师微信公众号中的文章,老师给我们的启示首先就是要坚持,万事开头难,但是只要肯坚持就一定会有所成就,不管是学习还是生活方面.其中最有触动的就是减肥了,是我三四年来一直难以完成的目标 ...

  7. HTML5 头部【快速编写】

    <!doctype html> <html><head> <meta charset="utf-8">#设置网页文件展示时使用的字符 ...

  8. #ifndef#define#endif的用法(整理)

    [转] #ifndef#define#endif的用法(整理)    原作者:icwk  文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都in ...

  9. php OpenSSL 加解密

    2018-1-6 17:10:19 星期六 $data = '123456'; $openssl_method = 'AES-256-CBC'; $openssl_iv_length = openss ...

  10. mysql 命令行常用命令

    1.显示数据库列表.  show databases; 2.显示库中的数据表:  use mysql; show tables; 3.显示数据表的结构:  describe 表名; 4.建库:  cr ...