review-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 def run_server(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ] if __name__ == '__main__': httpd = make_server('127.0.0.1', 8000, run_server) print("Serving HTTP on port 8000...") httpd.serve_forever()
中间件
五大中间件:
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对象。 - content-type: application/x-www-form-urlencoded - 请求体的格式:phone=8615131255555&password=asdfadfasdf&oneMonth=1
什么是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(1) from tb2 as count select col from sometable where othercol > %s as new_id from tb; Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,)) Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid']) raw models.UserInfo.objects.raw('select * from userinfo') connection from django.db import connection, connections cursor = connection.cursor() # cursor = connections['default'].cursor() cursor.execute("SELECT * from auth_user where id = %s", [1]) row = cursor.fetchone()
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=""> {% load staticfiles %} <img src="{% static 'img/1.png' %}" alt=""> b. 模板文件的查找顺序 优先找根目录下的templates > 根据app的注册顺序去每个app的templates中查找。 (静态文件) c. 模板的自定义方法 - simple_tag,无参数限制,一般用于返回一个值。 - inclusion_tag,无参数限制,一般用于返回一个HTML代码块。 - filter,有参数限制,一般用于返回一个值。特别的:可以在 {% if 后面条件 %}
Form & ModelForm
表单验证 & 数据库操作
admin & stark
详细参见demo
contenttypes
详细参见demo
                    
                
                
            
        
浙公网安备 33010602011771号