【面试】框架部分 @ systemime | 2022-02-16T15:51:06+08:00 | 5 分钟阅读 | 更新于 2022-02-16T15:51:06+08:00

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协议的模块:

  1. wsgiref,本质上就是编写一个socket服务端,用于接收用户请求(django)
  2. 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

© 2018 - 2022 systemime 的博客

Powered by Hugo with theme Dream.

---

avatar
关于我

systemime 的博客

记录一些生活与技术的事或思考

毕业于 🏫 山东科技大学泰山科技学院

目前职位为Python后端开发工程师

热爱代码,热爱开源

主要的技术栈是:

  • python
  • celery
  • django
  • shell
  • sql
  • go
  • nginx

爱好

  • 羽毛球
  • 编码
我的一些开源项目

计划或项目:

  • skill_test ➡️ 一个包含项目常用的django模板:常用脚本、单测方法、数据库连接池、异步请求池,restful风格的回调接口管理器 60%
  • Vbox ➡️ 一个基于k8s和docker的容器云平台,早期项目代码较简单 90%
  • YuQue-Assistant ➡️ 用于批量拉取语雀工作区文章,使用进程池+协程
  • 一个代理池 60%
  • simple_db_pool ➡️ 一个简单数据库连接池 100%
  • 一个电报消息转发脚本 90%
  • 使用flutter做一个app 计划中
  • 其他若干脚本(bilibili、微博图片视频下载、文件对比、图片颜色提取…)
其他

如果你喜欢我的博客、开源项目或者它们可以给你带来帮助,可以赏一杯咖啡 ☕ 给我。~

If you like my open source projects or they can help you. You can buy me a coffee ☕.~

PayPal

https://paypal.me/systemime

支付宝赞赏码

alipay

微信赞赏码

wechat

最好附加一下信息或者留言,方便我可以将捐助记录 📝 下来,十分感谢 🙏。

It is better to attach some information or leave a message so that I can record the donation 📝, thank you very much 🙏.