从大三上开始接触Django到现在差不多半年时间,做过一些大大小小的项目,个人认为Django网站框架还是比较容易上手并且功能十分强大!
以下内容是我的学习笔记:
Django项目创建与框架
# 创建Django项目  | 
project
- app01
- admin.py Django自带后台管理相关配置
 - models.py 写类、根据类创建数据库表
 - tests.py 单元测试
 - views.py 业务处理
 
 - project
- init.py
 - setting.py
 - urls.py
 - views.py
 - wsgi.py
 
 - templates
- .html
 
 - static
 
Django基础知识结构

一、路由系统
Http请求:path -> 视图(模板+数据)
一对一:path -> 函数
path('login/', views.login)  | 
正则匹配:re_path -> 函数
# 正则表达式:^xxx$ 起始符:^ 终止符:$  | 
url命名:
# urls.py  | 
路由分发:
# 从项目路由urls.py分发至app路由中  | 
伪静态:路由最后为.html后缀;好处:更好的被搜索引擎收录(提高page_rank)
re_path(r'^edit/(\w+).html$',views.edit)  | 
二、视图函数
FBV(function base views) 在视图里使用函数处理请求。
#urls.py  | 
# views.py  | 
CBV(class base views) 在视图里使用类处理请求。
#urls.py  | 
# views.py  | 
特殊CBV:
from django.views import View  | 
CBV中添加装饰器:
def wrapper(func):  | 
三、数据库操作
(详见上一篇博客)
四、模板引擎
1. 母版:页面继承
<!- base.html ->  | 
<!- index.html ->  | 
2. include:小组件
# pub.html  | 
3. 函数:自动执行
自定义函数步骤:
a、在app中创建templatetags模块
b、创建任意 .py 文件,如:xx.py
c、在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名
d、使用simple_tag
e、在settings中配置当前app,不然django无法找到自定义的simple_tag
simple filter:最多两个参数,可以做条件判断
{{ 第一个参数|函数名:"第二个参数" }}  | 
simple_tag:无限制
{% 函数名 参数 参数 参数 %}  | 
五、其他
1. xss攻击
慎用safe和mark_safe
非要用,一定要过滤关键字
2. CSRF跨站请求伪造
POST时,需要用户携带随机字符
基本应用:
form表单中添加:
{% csrf_token %}  | 
全站禁用:# ‘django.middleware.csrf.CsrfViewMiddleware’,
局部禁用:
from django.views.decorators.csrf import csrf_exempt  | 
局部应用:
from django.views.decorators.csrf import csrf_protect  | 
3. Cookie
保存在客户端浏览器上的键值对,设置超时时间
发送http请求时,在请求头中携带当前所有可访问的cookie
可以放很多,但是不用敏感信息
签名:obj.set_signed_cookie(‘ticket’,”123”,salt=’abc’)
  | 
4. Session
保存在服务端的数据(本质是键值对)
{  | 
应用:依赖cookie
作用:保持会话(Web网站)
好处:敏感信息不会直接给客户端
# Session存放位置  | 
配置文件中:存储位置、超时时间、每次刷新更新时间
requset.session
增删、获取随机字符串、主动设置超时时间
5. 分页
分批获取数据
models.UserInfo.objects.all()[0:10]  | 
Django自带(适合仅用上一页和下一页)
from django.core.paginator import Paginator, Page, EmptyPage,PageNotAnInteger  | 
<ul>  | 
6. Ajax提交数据时携带csrf的两种方式
① 放置在data中
<form method="post" action="csrf1">  | 
② 放置在请求头中
<script src="static/jquery-1.10.2.js"></script>  | 
7. 中间件
Django请求生命周期:中间件 -> url -> 视图
Web框架本质:socket
wsgiref+Django //性能低
uwsgi+Django //一定并发
WSGI协议:  | 
Web框架本质
import socket  | 
python标准库提供的独立WSGI服务器称为wsgiref
# WSGI+Django  | 

中间件
类:
process_request
process_response(…response):必须有返回值 return response
process_view(self, request, callback, callback_args, callback_kwargs)
process_exception(self, request, exception)
process_template_response(self,request,response)
注册中间件

应用:适用于对所有请求或一部分请求做批量处理
8. MVC&MTV
MVC:models(数据库、模型) + views(html模板) + controllers(业务逻辑处理)
MTV:models(数据库、模型) + templates(html模板) + views(业务逻辑处理)
Django -> MTV
from wsgiref.simple_server import make_server  | 
9. 自定义出错页面
自带的报错页面比较简洁与单调,可以通过配置达到自定义报错页面的展示。
① 修改settings.py
DEBUG=False
ALLOWED_HOSTS = [‘*’]
- TEMPLATES中:‘DIRS’: [os.path.join(BASE_DIR, ‘templates’)]
 
注:Django设置DEBUG为False时,’django.contrib.staticfiles’会关闭,即Django不会自动搜索静态文件。
② 修改url.py
from app import views  | 
③ 修改views.py
def page_not_found(request, exception):  | 
④ 添加自定义的报错页面即可