django杂七杂八
django-filter的使用
partial=True
- 当修改数据时,序列化器默认要求传递所有
required=True
的字段,否则is_valid
验证不通过 - 可以通过设置
partial=True
允许只修改部分字段,如下:-
s = DepartmentSerializer(department, data={'create_date': '2017-1-1'}, partial=True)
-
django上传下载文件操作
- 大体上就是通过request.files实现,但是文件大了之后,可以用f.chunks用生成器来做,具体见下面
- https://blog.csdn.net/bbwangj/article/details/80554533
django signal
- 基本使用:https://www.jianshu.com/p/dabf8fc7100a
- 更多参考:https://docs.djangoproject.com/en/1.11/ref/signals/#
django annotate
django获取全部url
django中的sql注入
WSGI
面试题
- 面试题上:https://mp.weixin.qq.com/s/eWpTamKBrAOaHltvKuLXEQ
- 面试题中:https://mp.weixin.qq.com/s/V_7bY_gCGkOIvC7RiNxYXw
- 面试题下:https://mp.weixin.qq.com/s/rvvdzrcEg7JzH__jYi1aoA
django中间件
class SimpleMiddleware: def __init__(self, get_response): self.get_response = get_response # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。 def __call__(self, request): # 此处编写的代码会在每个请求处理视图前被调用。 response = self.get_response(request) # 此处编写的代码会在每个请求处理视图之后被调用。 return response def process_view(self,request, view_func, view_args, view_kwargs): #process_view() 只在 Django 调用视图前被调用。 #在视图运行前或在 process_view() 内访问中间件里的 request.POST 将阻止中间件之后运行的任何视图修改请求的上传处理程序,通常应该避免这样。 pass def process_exception(request, exception)¶ #request 是一个 HttpRequest 对象。 exception 是一个由视图函数引发的 Exception 对象。 #当视图引发异常时,Django 会调用 process_exception()。process_exception() 应该返回 None 或 HttpResponse 对象。 pass def process_template_response(request, response)¶ #request 是一个 HttpRequest 对象。response 是 TemplateResponse 对象(或者等效对象),它通过 Django 视图或中间件返回。 #process_template_response() 在视图被完全执行后调用,如果响应实例有 render() 方法,表明它是一个 TemplateResponse 或等效对象。
中间件的执行顺序
django请求的生命周期
(1)用户输入网址,浏览器发起请求 (2)WSGI(服务器网关接口)创建socket服务端,接受请求 (3)中间件处理请求 (4)url路由,总路由==》子路由==》找到相应的视图函数 (5)进入view,进行业务处理,执行类或者函数,返回字符串 (6)再次通过中间件处理相应 (7)WSGI返回响应 (8)浏览器渲染
当queryset非常大时,数据请按需去取
当查询到的queryset的非常大时,会大量占用内存(缓存)。我们可以使用values和value_list方法按需提取数据。
article_list = Article.objects.filter(title__contains="django").values('title') if article_list: print(article.title) article_list = Article.objects.filter(title__contains="django").values_list('id', 'title') if article_list: print(article.title)
专业地使用explain方法
Django 2.1中QuerySet新增了explain方法,可以统计一个查询所消耗的执行时间。这可以帮助程序员更好地优化查询结果。
print(Blog.objects.filter(title='My Blog').explain(verbose=True)) # output Seq Scan on public.blog (cost=0.00..35.50 rows=10 width=12) (actual time=0.004..0.004 rows=10 loops=1) Output: id, title Filter: (blog.title = 'My Blog'::bpchar) Planning time: 0.064 ms Execution time: 0.058 ms
select_related和prefetch_related的用法与区别
- 主要是为了减少数据库查询次数,select_reacted主要是一对多,prefetch_reacted用于多对多
列举几个常用django第三方库
- django-redis,django-filter,django-allauth,django-ckeditor,django-crontab,django-celery,drf
- 更多见:这里
django如何实现高并发
使用nginx进行反向代理和负载均衡 数据库分库和读写分离(含主从复制) 使用nosql数据库比如redis缓存热点数据 耗时任务(比如发邮件或写入操作)交由celery异步处理 使用Gzip或django-compressor压缩静态文件 使用CDN加速静态文件访问
什么是wsgi,uwsgi,uWSGI?
Web服务器网关接口,是一套协议。用于接收用户请求并将请求进行初次封装,然后将请求交给web框架。实现wsgi协议的模块有: 1.wsgiref,本质上就是编写一个socket服务端,用于接收用户请求(django) 2.werkzeug,本质上就是编写一个socket服务端,用于接收用户请求(flask) uwsgi: 与WSGI一样是一种通信协议,它是uWSGI服务器的独占协议,用于定义传输信息的类型 uWSGI: 是一个web服务器,实现了WSGI协议,uWSGI协议,http协议,
django-xss攻击原理与防范
https://www.cnblogs.com/welan/p/9460889.html