pythn框架部分面试题
解决Django/flask内存泄露
对进程设定重启规则,如
- 使用gunicorn部署项目,设置–max-requests及–max-requests-jitter决定最多多少次请求后重启该worker以及worker重启随机抖动时间防止全部worker同时重启
- 使用uwsgi部署项目,通过设置max-requests及max-requests-delta决定worker重启规则
解决Celery内存泄露
通过配置worker_max_tasks_per_child (Django中是 CELERYD_MAX_TASKS_PER_CHILD), 使celery每个worker在执行固定的task后重启
app = Celery()
app.conf.worker_max_tasks_per_child = 100
或设定worker_max_memory_per_child, 限制每个worker按当前系统资源配置最大使用内存
一个网络上的小例子:https://kknews.cc/zh-cn/code/k4x3qnv.html
import psutil
max_men = (psutil.virtual_memory().totle * 0.75) / 1024
app.conf.worker_max_memory_per_child = int(max_men / app.conf.worker_concurrency)
Django生命周期
当用户在浏览器输入url时,浏览器会生成请求头和请求体发送给服务端,url经过Django中的wsgi时请求对象创建完成,经过django的中间件,然后到路由系统匹配路由,匹配成功后走到相对应的views函数,视图函数执行相关的逻辑代码返回执行结果,Django把客户端想要的数据作为一个字符串返回给客户端,客户端接收数据,渲染到页面展现给用户
常见内置组建
Admin、from、modelfrom、model
FBV和CBV
FBV:基于函数的视图函数
CBV:基于类的视图函数
Django 缓存方案
CACHES设置 BACKEND
- 缓存视图:
from django.views.decorators.cache import cache_page @cache_page(60 * 2) # 分钟
- 缓存操作
from django.core.cache import cache
- 缓存模板
{%load cache%} {%cache 60 cache_name %}
MVC和MTV模式
MTV:
- Model(模型):负责业务对象与数据库的对象(ORM)
- Template(模版):负责如何把页面展示给用户
- View(视图):负责业务逻辑,并在适当的时候调用Model和Template
MVC:
所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层;
他们之间以一种插件似的,松耦合的方式连接在一起。模型负责业务对象与数据库的对象(ORM),视图负责与用户的交互(页面),控制器(C)接受用户的输入调用模型和视图完成用户的请求。
Django中间件的作用
中间件是介于request与response处理之间的一道处理过程,能在全局上改变django的输入与输出
如:身份验证、权限校验、请求频率限制拦截等
Django中间件的4种方法及应用场景
自定义中间件必须继承MiddlewareMixin
导包:from django.utils.deprecation import MiddlewareMixin
5种方法:
-
process_request 获取请求时
-
process_view 执行到视图时
-
process_exception views中出现错误执行该方法
-
process_response 获取响应时
-
process_template_responseprocess 当函数中有render方法会执行该方法
什么是wsgi,uwsgi,uWSGI?
WSGI:
web服务器网关接口,是一套协议。用于接收用户请求并将请求进行初次封装,然后将请求交给web框架
实现wsgi协议的模块:
- wsgiref,本质上就是编写一个socket服务端,用于接收用户请求(django)
- werkzeug,本质上就是编写一个socket服务端,用于接收用户请求(flask)
uWSGI:
与WSGI一样是一种通信协议,它是uwsgi服务器的独占协议,用于定义传输信息的类型
uwsgi:
是一个web服务器,实现了WSGI协议,uWSGI协议,http协议,uWSGI具有超快的性能、低内存占用和多app管理等优点
runserver是单进程不能用于部署,所以常使用uwsgi
Django ORM
对象关系映射
优点:
1、ORM使得我们的通用数据库交互变得简单易行,并且完全不用考虑开始的SQL语句。快速开发,由此而来。
2、可以避免一些新手程序猿写sql语句带来的性能效率和安全问题。
缺点:
1、性能有所牺牲,不过现在的各种ORM框架都在尝试使用各种方法来减少这个问题(LazyLoad,Cache),效果还是很显著的。
2、对于个别的负责查询,ORM仍然力不从心。为了解决这个问题,ORm框架一般也提供了直接写原生sql的方式。
Django Model中class Meta中的原信息字段有哪些?
1、app_label 应用场景:模型类不在默认的应用程序包下的models.py文件中,这时候你需要指定你这个模型类是那个应用程序的。
2、db_table 应用场景:用于指定自定义数据库表名的
3、db_tablespace 应用场景:通过db_tablespace来指定这个模型对应的数据库表放在哪个数据库表空间。
4、verbose_name 应用场景:给你的模型类起一个更可读的名字:
5、verbose_name_plural 应用场景: 模型的复数形式是什么
6、ordering 应用场景:象返回的记录结果集是按照哪个字段排序的
Django 路由系统中name的作用
用于反向解析路由,相当于给url取个别名,只要这个名字不变,即使对应的url改变 通过该名字也能找到该条url