django-admin startproject 项目名称
python manage.py startapp 应用 app 名
mvc
Model:模型,和数据库进行交互
View:视图,生成Html
页面
Controller:控制器,接收请求,进行处理,与M和V进行交互,返回应答
mvt
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
WSGI : Web 服务器网关接口(Web Server Gateway Interface)
uWSGI服务器:Python Web服务器,常见的有gunicorn和uwsgi服务器
uwsgi协议:uWSGI 服务器与应用程序之间的二进制通信协议(属于WSGI)
参考:
表设计:
设计表时,尽量少使用外键,因为外键约束会影响插入和删除性能;
能用varchar确定字段长度时,就别用text
对于搜索频率高的字段属性,在定义时创建索引
对于存储不大,但在速度上有要求的可以使用char类型,反之可以用varchar类型
Django框架
前端性能优化
应用服务器性能优化
存储服务器优化
REST:表现层状态转换(Representational State Transfer)是一种设计风格
CSRF: 跨站请求伪造(Cross-site request forgery)
如何解决:
解决方案引发的两种问题
如何解决:
jwt认证:JSON Web Token,JWT 的诞生并不是解决 CSRF 跨域攻击,而是解决跨域认证的难题
pip install pyjwt
应用场景:
# 设置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
如图所示,
一般团购,秒杀,特价之类的活动,这样会使访问量激增,很多人抢购一个商品,作为活动商品,库存肯定是很有限的
使用场景:模板中的超链接,视图中的重定向
使用步骤:
{% url 'namespace_value:name_value'%}
redirect(reverse('namespce_value:name_value'))
注意:
反向解析传参数,主要是在我们的反向解析的规则后面添加了两个参数,两个参数之间使用空格隔开
<a href="{% url 'booktest:fan2' 2 3 %}">位置参数a>
Django里QuerySet的get和filter方法的区别
Django对数据查询结果排序怎么做,降序怎么做,查询大于某个字段怎么做
生成迁移文件和执行迁移文件的命令是什么
python manage.py makemigrations
python manage.py migrate
关系型数据库的关系包括哪些类型?
查询集返回列表的过滤器有哪些?(2018-4-16-lxy)
判断查询集中是否有数据
什么是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
额外的文档和强大的社区支持