django杂七杂八

django-filter的使用

partial=True

  • 当修改数据时,序列化器默认要求传递所有required=True的字段,否则is_valid验证不通过
  • 可以通过设置partial=True允许只修改部分字段,如下:
    • s = DepartmentSerializer(department, data={'create_date': '2017-1-1'}, partial=True)  

django上传下载文件操作

django signal

django annotate

django获取全部url

django中的sql注入

WSGI

面试题

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

     

原文地址:https://www.cnblogs.com/ycg-blog/p/12687680.html