文章目录
- [一、Django 框架概述](#一、Django 框架概述)
- [二、 Django项目搭建与使用](#二、 Django项目搭建与使用)
- 三、静态文件
- 四、中间件(类似装饰器)
- 五、CSRF(跨站请求伪造)
-
- [5.1 CSRF基本概念](#5.1 CSRF基本概念)
- [5.2 session保存至redis中](#5.2 session保存至redis中)
- [5.3 CSRF的django使用](#5.3 CSRF的django使用)
一、Django 框架概述
Django 是一个基于 Python 的高性能开源 Web 框架,遵循 MTV(Model-Template-View) 设计模式(类似 MVC)。它以"快速开发"和"干净设计"为核心理念,内置大量工具和功能,适合构建从简单博客到复杂企业级应用的各类项目
文档:https://docs.djangoproject.com/en/4.2/
核心特点
全栈框架 :提供 ORM、模板引擎、路由、认证等一站式解决方案。
高安全性 :默认防范 SQL 注入、XSS、CSRF 等常见漏洞。
可扩展性 :支持插件化设计,可通过第三方库扩展功能(如 REST framework)。
自动化工具:内置 Admin 后台、数据库迁移工具,减少重复代码。
主要组件
模型(Model) :通过 Python 类定义数据库结构,ORM 自动生成 SQL。
视图(View) :处理业务逻辑,返回 HTTP 响应或渲染模板。
模板(Template) :HTML 与 Django 模板语言结合,动态生成页面。
路由(URLconf):将 URL 映射到对应的视图函数。
二、 Django项目搭建与使用
包的安装
Django库的安装:
pip install django
项目的创建与启动
创建项目:
django-admin startproject projectname运行项目:
python manage.py runserver [127.0.0.1:8001](中括号内可指定)访问项目:
127.0.0.1:8001(浏览器中访问)
注:运行项目时,如果指定IP(python manage.py runserver 192.168.0.107),并用指定IP访问时,出于安全机制可能会无法访问,此时需要编辑setting.py文件,即允许该使用该IP访问
python
# 允许以哪些主机访问后端,默认127.0.0.1
ALLOWED_HOSTS = ['192.168.0.107', '127.0.0.1']
子应用的创建与关联
创建子应用:
python manager.py startapp login主应用关联子应用:修改主应用的setting.py代码
python
INSTALLED_APPS = [
# 法一:子应用名
# 'login',
# 法二:子应用名.apps.子应用名Config
'login.apps.LoginConnfig'
]
子应用各文件功能 (后面详细介绍各个模块功能)
view.py:视图相关
tests.py:测试相关
models.py:模型相关
migrations:迁移相关
admin.py:后台相关
apps.py:当前子应用相关
编辑子应用的views.py文件,用于返回内容
python
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse('index') # 这里可以直接返回html文件
接着再创建编辑
urls.py文件,用于访问时,调用到对于的视图函数
python
from django.urls import path
from login.views import index
urlpatterns = [
path('index/', index), # 前者正则 后者视图函数(view.py中的函数)
]
编辑主应用的
urls.py,添加引入子应用路由
python
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('login.urls')) # 引入子应用路由(比如该子应用为 login)
]
项目启动
项目启动:
python manage.py runserver浏览器访问:
http://127.0.0.1:8000/admin
setting.py配置
python
# 上线时为False,调试时为True(浏览页面发生错误,会告诉你那里错了)
DEBUG = True
# 语言 英文:en-us 中文:zh-Hans
LANGUAGE_CODE = 'zh-Hans'
# 时区 UTC Asia/Shanghai
TIME_ZONE = 'Asia/Shanghai'
三、静态文件
Diango中提供了一种解析的方式配置静态文件路径(html、图片等),静态文件可以放在项目根目录下,也可以放在应用的目录下,由于有些静态文件在项目中是通用的,所以推荐放在项目的根目录下,方便管理。
静态文件配置
配置 settings.py 文件
python
# Django通过STATIC_UR区分静态资源和动态资源
# 定义模板中引用静态文件时的URL前缀
STATIC_URL = 'static/'
# 指定项目级别的静态文件目录,BASE_DIR变量在该文件上面有定义
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
如果静态文件目录存在图片,运行时访问
http://127.0.0.1:8000/static/1.jpeg就会出现static中的图片
HTML中引用静态文件
加载static模板标签 :在html文件顶部加载static模板标签
引用静态文件的路径 :使用{% static %}模板标签生成完整路径
html
{% load static %}
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="{% static 'myapp/css/style.css' %}">
</head>
<body>
<script src="{% static 'myapp/js/script.js' %}"></script>
</body>
</html>
四、中间件(类似装饰器)
Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理对程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。
中间件的定义:定义一个中间件工厂函数,然后返回一个可以被调用的中间件。中间件工厂函数需要接收一个可以调用的get_response对象。返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。
我们可以使用中间件,在Diango处理视图的不同阶段对输入或输出进行干预。setting.py 中的 MIDDLEWARE 是中间件信息
建立中间件文件 middleware/middleware.py (类似装饰器)
python
def simple_middleware(get_response):
def middleware(request):
print('before request')
# 响应前
response = get_response(request)
# 响应后
print('after request')
return response
return middleware
在setting.py 中的 MIDDLEWARE 中加入如下内容
python
# 中间件
MIDDLEWARE = [
# ...
'ProjectName.middleware.simple_middleware', # 添加这行
]
让后访问触发view函数,终端就会打印
before request和after request
实例:可以用中间件来判断每次请求是否携带了cookie中的某些信息,通常如果不使用中间件,需要在每个函数中都添加判断的代码
不使用中间件写法如下(每个函数都要加cookie判断)
python
from django.views import View
from django.contrib.auth.mixins import LoginRequiredMixin
class CenterView(LoginRequiredMixin, View):
def get(self, request):
username = request.COOKIES.get('username')
if username is None: # 添加判断
print('username is None')
return HttpResponse('没有登入')
return HttpResponse('个人中心展示')
def post(self, request):
username = request.COOKIES.get('username')
if username is None: # 添加判断
print('username is None')
return HttpResponse('没有登入')
return HttpResponse('个人中心信息修改')
中间件写法:可以利用中间件,在中间件中加入cookies检测,views视图中就可以不用使用检测
python
def simple_middleware(get_response):
def middleware(request):
# 添加判断
username = request.COOKIES.get('username')
if username is None:
print('username is None')
return HttpResponse('没有登入')
response = get_response(request)
return response
return middleware
python
from django.views import View
from django.contrib.auth.mixins import LoginRequiredMixin
class CenterView(LoginRequiredMixin, View):
def get(self, request):
return HttpResponse('个人中心展示')
def post(self, request):
return HttpResponse('个人中心信息修改')
多个中间件顺序:请求前的执行顺序是按照注册的顺序从上往下(settings.py中),响应后的顺序是从下往上(注册的反顺序)
五、CSRF(跨站请求伪造)
5.1 CSRF基本概念
CSRF 指攻击者盗用了你的身份,以你的名义发送恶意请求。包括:以你名义发送邮件,发消息盗取你的账号,甚至于购买商品,虚拟货币转账...
造成的问题 :个人隐私泄露以及财产安全。

生成随机码
csrf_token放入cookie是
同源策略的原因,黑客(钓鱼)网站是用于获取不到我们当前网站的cookie信息的
python
def get(self, request):
from django.middleware.csrf import get_token
# 生成随机码
csrf_token = get_token(request)
response = render(request, 'index.html', context={'csrf_token': csrf_token})
# 将验证码保存至cookie中
response.set_cookie('csrftoken', csrf_token)
return response
获取用户输入的随机码并验证
python
def index(self, request):
# 获取用户数据
user_token = request.POST.get('csrftoken')
to_account = request.POST.get('to_account')
# 获取系统生成的验证码
server_token = request.COOKIES.get('csrf_token')
# 输入的验证码和系统生成的验证
if user_token != server_token:
return HttpResponse('输入错误')
上面获取数据是通过name属性获取的
html
<body>
<input type="hidden" name="csrftoken">
<input type="text" name="to_account">
<input type="number" name="money">
</body>
源 :是协议、域名、端口号组成
同源策略:同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。
5.2 session保存至redis中
session数据的保存、获取、删除(views.py)
python
# 增加数据
class SetSession(View):
def get(self, request):
request.session['name'] = 'Tony'
return HttpResponse('abc')
# 获取数据
class GetSession(View):
def get(self, request):
name = request.session['name']
return HttpResponse('abc')
# 删除数据
class DelSession(View):
def get(self, request):
# 删除一条数据
del request.session['name']
# 删除session所有数据
# request.session.clear()
# 把数据库/redis中的key都删除了
# request.session.flush()
return HttpResponse('abc')
# session时间,到了时间自动删除
class DelSession(View):
def get(self, request):
# 设置session时间,默认两周
request.session.set_expiry(10)
return HttpResponse('abc')
session数据存储位置
在settings.py中,可以设置session数据的存储方式,可以保存在数据库、本地缓存等
保存数据库中
这是默认方式,可以不配置,当然也可以按如下配置
python
SESSION_ENGINE = 'django.contrib.sessions.backends.d'
INSTALLED_APPS = [
# ...
'django.contrib.sessions',
]
本地缓存
存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快
python
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
混合缓存
优先从本机内存中存取,如果没有则从数据库中存取
python
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
Redis存储
在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决。
django-redis链接:https://django-redis-chs.readthedocs.io/zh_CN/latest/
安装扩展:
pip install django-redis配置settings.py内容如下
python
# caches缓存
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
5.3 CSRF的django使用
login.html
html
<body>
<from action="" method="post">
<input type="text" name="money">
<input type="submit" value="提交">
</from>
</body>
python
from book.views import LoginView
urlpatterns = [
path('login/', LoginView.as_view()),
]
python
class LoginView(View):
def get(self, request):
return render(request, 'login.html')
def post(self, request):
return HttpResponse('post')
在上面的基础上,浏览链接输入内容后点击提交会报错,需要在login.html中加入如下代码
html
<body>
<from action="" method="post">
{% csrf_token %}
<input type="text" name="money">
<input type="submit" value="提交">
</from>
</body>
然后点击提交,会跳转到post请求中去