文章目录
- 1.Django创建项目的命令
- 2.MVC,MVT的理解
- 3.Django中间件的使用
- 4.WSGI,uWSGI服务器 和 uwsgi协议
- 5.nginx和uWISG 服务器之间如何配合工作的
- 6.django开发中数据库做过什么优化
- 7.Python中三大框架各自的应用场景
- 8.django如何提升性能(高并发)
- 9. 什么是restful api谈谈你的理解?
- 10 什么csrf攻击原理,如何解决
- 11.Django中的cookie和session
- 12.简述Django下的(内建的)缓存机制
- 13.Django HTTP请求的处理流程
- 14.Django重定向你是如何实现的,用的什么状态码
- 15.电商网站库存问题
- 16.什么是反向解析
- 17.ORM
- 18.Restful Api
1.Django创建项目的命令
django-admin startproject 项目名称
python manage.py startapp 应用 app 名
2.MVC,MVT的理解
-
mvc
-
Model:模型,和数据库进行交互
-
View:视图,生成Html
-
页面
-
Controller:控制器,接收请求,进行处理,与M和V进行交互,返回应答
-
-
mvt
- Model:模型,和数据库进行交互
- View:视图,接收请求,进行处理,与M和T进行交互,返回应答
- Template:模板,生成Html页面
3.Django中间件的使用
1.自定义中间件
from django.utils.deprecation import MiddlewareMixin
class Md1(MiddlewareMixin):
def __init__(self):
pass
def process_request(self, request):
print("md1请求")
def process_view(self, request, callback, callback_args, callback_kwargs):
print("md1 process_view...")
def process_exception(self, request, exception):
print("md1 process_exception...")
def process_template(self, request, exception):
print("md1 process_template...")
def process_response(self, request, response):
print("md1 process_response...")
return response
class Md2(MiddlewareMixin):
def __init__(self):
pass
def process_request(self, request):
print("md2请求")
def process_view(self, request, callback, callback_args, callback_kwargs):
print("md2 process_view...")
def process_exception(self, request, exception):
print("md2 process_exception...")
def process_template(self, request, exception):
print("md2 process_template...")
def process_response(self, request, response):
print("md2 process_response...")
return response
2.中间件执行顺序
md1请求
md2请求
md1 process_view...
md2 process_view...
md2 process_exception...
md1 process_exception...
md2 process_template...
md1 process_template...
md2 process_response...
md1 process_response...
3.Django3.0中自定义中间件的三种方法
-
方式一
def simple_middleware(get_response): # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。 def middleware(request): # 此处编写的代码会在每个请求处理视图前被调用。 response = get_response(request) # 此处编写的代码会在每个请求处理视图之后被调用。 return response return middleware
-
方式二
class SimpleMiddleware: def __init__(self, get_response): self.get_response = get_response # One-time configuration and initialization.一次性设置和初始化 def __call__(self, request): # Code to be executed for each request before # the view (and later middleware) are called. # 视图函数执行前的代码 response = self.get_response(request) # Code to be executed for each request/response after # the view is called. 视图函数执行后的代码 return response
4.WSGI,uWSGI服务器 和 uwsgi协议
WSGI : Web 服务器网关接口(Web Server Gateway Interface)
uWSGI服务器:Python Web服务器,常见的有gunicorn和uwsgi服务器
uwsgi协议:uWSGI 服务器与应用程序之间的二进制通信协议(属于WSGI)
参考:
1.Python 之 WSGI、uWSGI 和 uwsgi 介绍
5.nginx和uWISG 服务器之间如何配合工作的
6.django开发中数据库做过什么优化
表设计:
-
设计表时,尽量少使用外键,因为外键约束会影响插入和删除性能;
-
能用varchar确定字段长度时,就别用text
-
对于搜索频率高的字段属性,在定义时创建索引
-
对于存储不大,但在速度上有要求的可以使用char类型,反之可以用varchar类型
Django框架
- Django orm框架下的Querysets 本来就有缓存的
- 若页面只需要数据库里某一个两个字段时,可以用QuerySet.values()
- 在模板标签里使用with标签可以缓存QuerySet的查询结果
- 如果一个页面需要多次连接数据库,最好一次性取出所有需要的数据,减少对数据库的查询次数
7.Python中三大框架各自的应用场景
- django:大而全,提供了许多的内置方法(ORM,表单),适合中大型项目,如企业级网站,社交网络,电子商务平台等
- flask:小而灵活,几乎所有的功能都需要扩展,适合快速原型开发,小型项目,微服务等场景
- Tornado:异步的Web框架,适合构建高性能,实时性要求高的Web应用程序,例如通讯,实时地理位置信息服务,实时分析等场景
8.django如何提升性能(高并发)
前端性能优化
- 使用雪碧图减少http请求,降低文件大小,提高文件的缓存利用率
- 使用浏览器缓存,将静态资源缓存到本地浏览器,通过设置http头中的cache-control和expires的属性.可设定浏览器缓存,缓存时间可以自定义
- 对html,css,javascript文件进行压缩,减少网络的通信量
应用服务器性能优化
- 合理的使用缓存技术,例如首页做一个缓存,设置一定得过期时间
- 使用celery.例如发邮件,发短信一些耗时的异步操作交给异步队列执行
- 配置合适的nginx参数,提升效率
存储服务器优化
- 读写分离
9. 什么是restful api谈谈你的理解?
REST:表现层状态转换(Representational State Transfer)是一种设计风格
10 什么csrf攻击原理,如何解决
CSRF: 跨站请求伪造(Cross-site request forgery)
如何解决:
- 表单中添加 csrf_token 标签
解决方案引发的两种问题
- 服务端每生成一个 Token,都会存放入 session 中,而随着用户请求的增多,服务端的开销会明显增大
- 如果网站有多个子域,分别对应不同的服务器,比如 taobao.com 后台是服务器 a,zhibo.baotao.com 后台是服务器b,不同子域要想使用同一个 Token,就要求所有的服务器要能共享这个 Token.一般要有一个中心节点(且应是一个集群)来存储这个Token,这样看下来,架构就变得更加复杂了
如何解决:
-
jwt认证:JSON Web Token,JWT 的诞生并不是解决 CSRF 跨域攻击,而是解决跨域认证的难题
pip install pyjwt
应用场景:
- 当访问量/业务量不是很大时,可以使用 CSRF Token 来防止 CSRF 攻击
- 相反访问量/业务量对服务器造成很大压力,改用 JWT,建议使用 cookie存储jwt
- 客户端可以将JWT通过js脚本放入 Header里的Authorization 字段。这么看好像同时存在CSRF 攻击风险和 XSS 攻击风险,实则不然,我们虽然将 JWT存储在 cookie 里,但是我们的服务端并没有利用 cookie 里的 JWT 直接去鉴权,而是通过header里的 Authorization去鉴权,因此这种方法只有 XSS 攻击风险,而没有CSRF 攻击风险
11.Django中的cookie和session
# 设置cookie
response.set_cookie('h1', 'hello django')
# 读取cookie
request.COOKIES.get('my_cookie')
# 读取session
request.session.get('键',默认值)
# 写入session
request.session['键']=值
# 删除session
del request.session['键']
# 设置过期时间
request.session.set_expiry(value)
request.session.clear()
request.session.flush()
Session,是服务器端保持状态的方案,而Cookie是在客户端保持状态的方案.但是禁用Cookie就不能得到Session,因为Session是用 Session ID 来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用 Cookie 相当于失去了 SessionID,也就得不到 Session
12.简述Django下的(内建的)缓存机制
13.Django HTTP请求的处理流程
如图所示,
- 一个 HTTP 请求,首先被转化成一个 HttpRequest 对象,然后该对象被传递给 Request 中间件处理,如果该中间件返回了Response,则直接传递给 Response 中间件做收尾处理
- 否则的话 Request 中间件将访问 URL 配置,确定哪个 view 来处理,在确定了哪个 view 要执行,但是还没有执行该 view 的时候,系统会把 request 传递给 view 中间件处理器进行处理
- 如果该中间件返回了 Response那么该 Response 直接被传递给 Response 中间件进行后续处理
- 否则将执行确定的 view 函数处理并返回 Response,在这个过程中如果引发了异常并抛出,会被 Exception 中间件处理器进行处理
14.Django重定向你是如何实现的,用的什么状态码
- 使用HttpResponseRedirect
- redirect和reverse
- 状态码:302,301
15.电商网站库存问题
一般团购,秒杀,特价之类的活动,这样会使访问量激增,很多人抢购一个商品,作为活动商品,库存肯定是很有限的
- 控制库存问题,数据库的事务功能是控制库存超卖的有效方式
- 将需要秒杀的商品放入缓存中(直接读库写库对数据库压力太大了)
- 多用户并发修改同一条记录时,可以使用加乐观锁的机制去解决高并发的问题(后提交的用户将覆盖掉前者提交的结果)
16.什么是反向解析
使用场景:模板中的超链接,视图中的重定向
使用步骤:
- 在定义url时为include定义namespace属性,为url定义name属性
- 在模板中使用url标签:
{% url 'namespace_value:name_value'%}
- 在视图中使用reverse函数:
redirect(reverse('namespce_value:name_value'))
注意:
反向解析传参数,主要是在我们的反向解析的规则后面添加了两个参数,两个参数之间使用空格隔开
<a href="{% url 'booktest:fan2' 2 3 %}">位置参数</a>
17.ORM
Django里QuerySet的get和filter方法的区别
- 输入参数
get 的参数只能是model中定义的那些字段,只支持严格匹配。
filter的参数可以是字段,也可以是扩展的 where查询关键字,如 in,like 等。 - 返回值
get返回值是一个定义的 model 对象。
filter返回值是一个新的 QuerySet 对象,然后可以对 QuerySet 再进行查询返回新的 QuerySet 对象,支持链式操作,QuerySet 一个集合对象,可使用迭代或者遍历,切片等,但是不等于 list 类型(使用一定要注意)。 - 异常
get只有一条记录返回的时候才正常,也就说明 get 的查询字段必须是主键或者唯一约束的字段。当返回多条记录或者是没有找到记录的时候都会抛出异常
filter 有没有匹配的记录都可以
Django对数据查询结果排序怎么做,降序怎么做,查询大于某个字段怎么做
- 排序使用order_by()
- 降序需要在排序字段名前加-
- 查询字段大于某个值:使用filter(字段名_gt=值)
生成迁移文件和执行迁移文件的命令是什么
python manage.py makemigrations
python manage.py migrate
关系型数据库的关系包括哪些类型?
- ForeignKey:一对多,将字段定义在多的一端中。
- ManyToManyField:多对多:将字段定义在两端中。
- OneToOneField:一对一,将字段定义在任意一端中。
查询集返回列表的过滤器有哪些?(2018-4-16-lxy)
- all() :返回所有的数据
- filter():返回满足条件的数据
- exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字
- order_by():排序
判断查询集中是否有数据
- exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。
18.Restful Api
什么是restful api谈谈你的理解
REST:Representational State Transfer的缩写,翻译:“具象状态传输”。一般解释为“表现层状态转换”。
REST是设计风格而不是标准。是指客户端和服务器的交互形式。我们需要关注的重点是如何设计REST风格的网络接口。
REST的特点:
1.具象的。一般指表现层,要表现的对象就是资源。比如,客户端访问服务器,获取的数据就是资源。比如文字、图片、音视频等。
2.表现:资源的表现形式。txt格式、html格式、json格式、jpg格式等。浏览器通过URL确定资源的位置,但是需要在HTTP请求头中,用Accept和Content-Type字段指定,这两个字段是对资源表现的描述。
3.状态转换:客户端和服务器交互的过程。在这个过程中,一定会有数据和状态的转化,这种转化叫做状态转换。其中,GET表示获取资源,POST表示新建资源,PUT表示更新资源,DELETE表示删除资源。HTTP协议中最常用的就是这四种操作方式。
RESTful架构:
1.每个URL代表一种资源;
2.客户端和服务器之间,传递这种资源的某种表现层;
3.客户端通过四个http动词,对服务器资源进行操作,实现表现层状态转换
有用过Django REST framework 吗?(2018-4-14-lxy)
Django REST framework 是一个强大而灵活的 Web API 工具.使用 RESTframework 的理由有:
Web browsable API 对开发者有极大的好处
包括 OAuth1a 和 OAuth2 的认证策略
支持 ORM 和非 ORM 数据资源的序列化
全程自定义开发——如果不想使用更加强大的功能,可仅仅使用常规的function-based views
额外的文档和强大的社区支持