从大三上开始接触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): |
④ 添加自定义的报错页面即可