Ⅰ Django框架入门必会三板斧
【一】Django项目如何添加新功能
- 启动django项目之后 如何添加更多的功能
- 回想自己编写的web框架 如果要添加功能 就去urls.py和views.py
【1】添加URL映射
- 在项目的 urls.py 文件中,通过导入相应的应用(app)及其视图函数,并使用 path() 或 include() 函数来定义 URL 映射规则。
- 例如,如果要在名为 "myapp" 的应用中添加一个用于显示博客文章列表的 URL,则可以在 urlpatterns 中添加如下配置
from django.urls import path
from . import views
urlpatterns = [
path('blog/', views.blog_list, name='blog_list'),
]
- 这将把 "/blog/" 映射到 views.blog_list 视图函数。
【2】添加视图函数
- 然后,在对应的 "myapp/views.py" 文件中,创建视图函数以处理 HTTP 请求。
- 例如,blog_list 可能如下实现:
from django.shortcuts import render
from .models import BlogPost
def blog_list(request):
posts = BlogPost.objects.all()
return render(request, 'myapp/blog_list.html', {'posts': posts})
- 这里假设有一个名为 "BlogPost" 的模型,并有一个包含模板 blog_list.html 的对应 HTML 模板文件。
【二】三板斧(返回HTTP响应、渲染HTML和重定向)
【1】HttpResponse
- HttpResponse: 这是 Django 自带的类,用于构建基本的 HTTP 响应。
- 例如,当需要返回纯文本或 JSON 数据时,可以这样创建响应:
from django.shortcuts import HttpResponse
def index(request):
# 字符串形式的数据渲染到页面上还是字符串
data = "hello world"
# hello world
# 字典格式的数据通过 HttpResponse 返回给前端页面显示的内容就是当前键
data = {"username": "silence", "password": "666"}
# usernamepassword
return HttpResponse(data)
【2】render
- 主要用于返回html文件 并且支持模板语法(django自己写的)
- render(): 这个函数用于从给定的模板加载内容,并将其插入到 HTTP 响应中作为 HTML 内容发送给客户端。
- 例如,在上面的 blog_list 视图中,我们使用了它来返回带有博客文章列表的 HTML:
from django.shortcuts import render
def index(request):
# 前端模版文件一定要放在当前 app 下的 templates 目录下
# render(必传 request,前端文件名 "login.html")
# locals() : 局部名称空间 将当前参数传递给前端的 html 页面
# html 页面通过 模版语法{{}} 使用变量
user_data = {"username": "silence", "password": "666"}
return render(request, "login.html", locals())
<h1>登陆页面</h1>
<h2>1111</h2>
<h2>222</h2>
<h1>前端模版语法</h1>
<!-- {{ user_data }} {"username": "silence", "password": "666"} -->
【3】redirect
- 主要用于重定向 括号内可以写其他网站的全称 也可以自己网站的后缀
- redirect(): 该函数用于向用户返回一个 HTTP "Redirect" 响应,使浏览器跳转至指定的 URL。
def index(request):
# redirect : 重定向路由请求地址 状态 3xx
# 左侧 / :代表的是从根目录开始找路由
# login : 路由映射
# 根目录 http://127.0.0.1:8000
# 将访问到指定路由的请求进行转发重定向至新的地址
return redirect(to="/login/")
# http://localhost:8000 被重定向为 http://localhost:8000/login/
【4】补充django 自带了重启功能
- ctrl + s 保存 保存以后会自动发生重启
- 对于前端页面来说 前端是浏览器负责渲染的 所以 修改前端页面的时候不需要重启 Django 直接刷新即可
Ⅱ Django静态文件 static
【一】静态文件配置说明
【1】模版文件
- 我们将html文件默认都放在templates文件夹下
【2】资源文件
- 我们将网站所使用的静态文件默认都放在static文件夹下
静态文件:前段已经写好,能直接使用的文件
网站写好的JS文件
网站写好的CSS文件
网站用到的图片文件
第三方框架
...
拿来直接就可以使用的文件
- 一般情况我们再static文件夹下还会对文件进行划分
- js文件夹
- css文件夹
- img文件夹
- plugins文件夹
- 在浏览器中输入url能够看到对应的资源
- 是因为后端提前开设了相关的接口
- 如果访问不到资源,说明后端没有开设相关资源的端口
【3】Django静态文件结构树
- 静态文件夹 都叫 static
- css 文件夹 存储 css样式 静态文件
- js 文件夹 存储 js动作 静态文件
- font 文件夹 存储 字体 静态文件
- plugins 文件夹 存储 插件 静态文件
【二】静态文件配置
【1】配置文件增加配置
- static文件夹跟manage.py一级 如果放在引入发app文件夹下不用再配置文件中配置 可以直接使用,若是放在外面需要在settings.py 配置文件中增加如下配置
(1)后端
# /static/ ---> 从根路径下开始找 static 路径
STATIC_URL = '/static/' # 类似于访问静态文件的令牌
# 静态文件配置
# 默认查找位置是当前APP的目录下
# 这个配置定义了静态文件应用在启用 FileSystemFinder 查找器时将穿越的额外位置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
(2)前端
- 在前端页面中增加如下配置,即可使用静态文件模版语法
{% load static %} # 一般放在代码最上面<!DOCTYPE html>上面
<script src="{% static 'js/jquery.min.js' %}"></script>

【2】配置文件说明
- 如果想要访问static静态文件,就必须以static开头
- 如:/static/js/bootstrap.min.js
【3】总结步骤
# 【1】在页面上想要使用 jQuery文件
# (1)cdn链接引入
# <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
# (2)引入本地文件 --- 不能用
# <script src="jquery.min.js"></script>
# 发现页面上的js时间不生效
# 打开开发开发者模式 ---> 网络 (Network)
# 请求 url : http://127.0.0.1:8000/login/jquery.min.js
# 状态码 404 not found 资源不存在
# (3)静态文件加载
# [1]方式一
# <script src="../../static/jquery.min.js"></script>
# 请求 url :http://127.0.0.1:8000/static/jquery.min.js
# 404 Not Found
# [2]前提是必须加载 static 才能使用
# {% load static %}
# <script src="{% static 'js/jquery.min.js' %}"></script>
# 请求 url :http://127.0.0.1:8000/static/jquery.min.js
# 404 Not Found
# [3]没有配置静态文件目录
# STATICFILES_DIRS = [
# os.path.join(BASE_DIR, 'static')
# ]
# 有了静态文件目录配置后你就发现能够使用了
# 总结 使用 static 静态文件的步骤
# 【1】确定你的 地址
# STATIC_URL = '/static/'
# 【2】确定你确实有一个 static 文件夹
# (1)将 static 文件夹放在当前APP目录下
# Django项目在加载环境变量的时候 因为你已经注册了 app 能够找到 app 目录下
# 如果放到和根目录同级的目录下 因为Django的权限原因 加载不到除当前APP以外的区域
# 放到 app 里面正常用
# 放到 app 外边就用不了了
# (2)创建一个参数项 STATICFILES_DIRS
"""
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
"""
# 【3】在前端使用静态文件
# (1)在整个文档的最上面 加载 static 文件夹
# {% load static %}
# (2)在指定得 标签上使用静态文件
# a href
# img src
# script src
# link href
# background-img : url("{% static "地址" %}")
# 【4】内部的原理
# 因为你已经配置了 STATIC_URL
# 可以找到 以 http://127.0.0.1:8899/static/ ...
# 访问静态文件的时候可以挨个检索资源目录 默认的资源目录就是app下的目录
# 将当前资源自动转换为制定的地址发起请求 http://127.0.0.1:8899/static/ ...
# 【5】将当前APP的view源码文件放在了 static 目录下
# 数据泄露 --> 大家都能看到你写的后端的源码
# 在别的公司还真发生过
【三】静态文件配置补充
【1】前缀
- 如果你想用一个额外的命名空间来引用其中一个位置的文件,你可以 可选的 提供一个前缀作为 (prefix, path) 的元组
- 例如:
STATICFILES_DIRS = [
# ...
("downloads", "/opt/webfiles/stats"),
]
- 例如,假设你将 STATIC_URL 设置为 '/static/',则 collectstatic 管理命令将收集 STATIC_ROOT 的 'downloads' 子目录中的“stats”文件。
- 这将允许你在你的模板中用 '/static/downloads/polls_20101022.tar.gz' 引用本地文件 '/opt/webfiles/stats/polls_20101022.tar.gz',例如:
<a href="{% static 'downloads/polls_20101022.tar.gz' %}">
【2】存储引擎
- 默认: 'django.contrib.staticfiles.storage.StaticFilesStorage'
class StaticFilesStorage(FileSystemStorage):
"""
Standard file system storage for static files.
The defaults for ``location`` and ``base_url`` are
``STATIC_ROOT`` and ``STATIC_URL``.
"""
def __init__(self, location=None, base_url=None, *args, **kwargs):
if location is None:
location = settings.STATIC_ROOT
if base_url is None:
base_url = settings.STATIC_URL
check_settings(base_url)
super().__init__(location, base_url, *args, **kwargs)
# FileSystemStorage fallbacks to MEDIA_ROOT when location
# is empty, so we restore the empty value.
if not location:
self.base_location = None
self.location = None
def path(self, name):
if not self.location:
raise ImproperlyConfigured("You're using the staticfiles app "
"without having set the STATIC_ROOT "
"setting to a filesystem path.")
return super().path(name)
- 使用 collectstatic 管理命令收集静态文件时要使用的文件存储引擎。
- 在此配置中定义的存储后端的即用实例可以在 django.contrib.staticfiles.storage.staticfiles_storage 中找到。
- 默认情况下,将查找存储在 STATICFILES_DIRS 配置中的文件(使用 django.contrib.staticfiles.finders.FileSystemFinder)和每个应用程序的 static 子目录中的文件(使用 django.contrib.staticfiles.finders.AppDirectoriesFinder)。如果存在多个同名文件,将使用第一个找到的文件。
- 有一个查找器是默认禁用的: django.contrib.staticfiles.finders.DefaultStorageFinder。如果添加到你的 STATICFILES_FINDERS 配置中,它将在 DEFAULT_FILE_STORAGE 配置所定义的默认文件存储中查找静态文件。
【四】示例
【1】引言
- 以登录注册功能为例
- 我们之所以可以在浏览器地址栏中输入不同的路由访问到不同的资源
- 是因为我们在后端框架中提前开设了相应的访问接口所以用户才能访问
- 言外之意就是我们没有开设接口 那么肯定访问不到
【2】解决方案
(1)开始登陆页面接口
(2)登录页面渲染静态文件
- 登录界面需要使用bootstrap并且还需要自己编写css和js
(3)前端获取用户数据
- 页面需要获取前端用户数据并且传递给后端
- form表单
- action参数:控制数据的提交地址
- method参数:控制请求的提交方式
(4)访问登录页面
(5)开设静态资源接口
- 理论上应该自己去路由层开设接口资源 但是由于静态文件资源使用频率很高
- 只要是一个web项目都肯定需要
- 所以django为了避免开发者繁琐
- 提供了静态资源的配置文件
- 只需要填写固定的配置即可开设资源接口
# 静态文件资源访问接口固定配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
# html页面路径
/static/mycss.css
Ⅲ Django有两种静态文件
【1】static
- 称为静态文件夹,是不变的,形成网站的核心部件
- 如 CSS文件,JS文件,背景图片等
- 可为Templates模板提供支持
- 称为媒体文件夹,是变动的,由用户定义的文件
- 如 用户头像, 用户上传的图片或视频等;
- 可为富文本编辑器mdeditor提供支持
【一】前言
- 我要做的是个人博客,不提供其他人注册登录功能,故media只是为了存放文章的封面、图片等信息。
- 故在目录方面,我的设置如下:
- static目录与Templates目录放在一起,由“主题目录接管”
- 主题目录:与manage.py同级目录下创建templates目录,目录下创建主题文件夹,如default,里面创建templates和static静态文件夹
- 如果想更换主题,只需创建新主题文件夹,变动templates和static即可
- media目录放在根目录,毕竟我的“主题”无论怎么换,博客文章内容不会换,涉及的本地图片不会变动
【二】配置说明(static)
【1】引入
【2】配置解释
- STATIC_URL - 可以理解为通过url访问static文件的路径
- 如 项目路径是:{{projectName}}/static/common_static/test.css
- 则访问url是:http://IP:PORT/static/common_static/test.css
- STATIC_ROOT - 可以理解为你打算在服务器上存储static文件的路径(通过 python manage.py collectstatic命令)
- collectstatic命令后将复制静态文件到STATIC_ROOT指定的目录中,
- 部署django项目的时候需要
- STATICFILES_DIRS - 可以理解为配置Django寻找静态文件时首先去STATICFILES_DIRS里面寻找, 其次再到各个app的static文件夹里面找
- Django查找静态文件是惰性查找
- 查找到第一个,就停止查找了
- django放置静态文件有两种方式
- 一是在每个app里新建一个static目录,将静态文件放置其中;
- 另一种是对公共文件的处理,如jQuery bootstrap等,这时就需要配置 STATICFILES_DIRS。
【三】配置文件修改(static)
【1】debug模式
- 确定主题目录/templates/default/,创建static文件夹
# debug模式在settings中进行设置
# 对外提供WEB访问时的URL地址
STATIC_URL = '/static/'
# 开发阶段放置项目自己的静态文件,不能包含STATIC_ROOT路径
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'templates', THEME, 'static'),
]
【2】非debug模式
# 在`settings.py`同级的`urls.py`内还需要把`STATIC_URL`和django的url连接起来
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
# 非debug模式在settings中进行设置,需要修改
STATIC_URL = '/static/'
# 执行collectstatic命令后会将项目中的静态文件(包括STATICFILES_DIRS、自带admin的静态文件)收集到该目录下面来(所以不应该在该目录下面放置自己的一些静态文件,因为会覆盖掉)
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'collect_static'),
)
【3】模板中使用静态文件
- {%load static%}和{%load staticfiles%}:哪个是首选?
- Django2.x之后废弃{%load staticfiles%}语法
{% load static %}
<img src="{% static "my_app/example.jpg" %}" alt="My image"/>
【4】全局配置
- 模板中使用静态文件,无需load static,配置全局使用load static
- TEMPLATES加入'builtins': ['django.templatetags.static']
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates', THEME, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
'builtins': ['django.templatetags.static']
},
},
]
- MEDIA_ROOT - 设置用户上传文件的实际保存目录,该文件夹自动创建
- MEDIA_URL - 代表用户通过URL来访问这个本地地址的URL
- 如 本机MEDIA_URL 为/media/
- 则访问url是:http://IP:PORT/media/
【1】配置文件注册
# 在根目录下的 settings.py 中添加如下配置
MEDIA_URL='/media/'
MEDIA_ROOT=os.path.join(BASE_DIR,"media")
【2】路由映射
# 导入项目文件夹中settings.py模块
# 或者 from . import settings
from django.conf import settings
# 导入相关静态文件处理的views控制包
from django.views.static import serve
urlpatterns = [
re_path('media/(?P<path>.*)$', serve, {'document_root': MEDIA_ROOT}),
]
【3】模型文件配置
- FileField或ImageField字段适用于存储文件/图片
- 出于性能考虑,文件并不直接保存到数据库,而是保存在文件系统里,因此该字段只是记录一个路径而已。
img_link = models.ImageField(upload_to='images/%Y-%m', max_length=255,
help_text='提示:不添加封面可以不选择图片,默认没有图片',
blank=True, null=True, verbose_name='文章封面')
# upload_to相当于上传到/media/images目录下,格式为year-month,如2019-10
avatar = models.FileField(verbose_name='头像', upload_to='upload/avatar/')
# upload_to相当于上传到/media/upload/avatar/目录下
【4】模版文件使用
(1)方式一
<img src="/media/{{ article.img_link }}">
(2)方式二
<img src="{{ article.img_link.url }}">
Ⅳ Django框架入门之request对象
【一】request对象引入
【1】提交GET请求
(1)前端
- form表单中action属性,不写默认是当前路由地址
- form表单中的method属性,不写默认是GET请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>注册页面</h1>
{#form表单#}
<form action="" method="get">
{# action : 用来定义数据提交的路径的 不写 是默认当前请求地址 写了 指定的请求地址 #}
{# method : get 提交 get请求 post 提交 post 请求 #}
<p>
<label for="usernameInput">username : </label>
<input type="text" id="usernameInput" name="username">
</p>
<p>
<label for="passwordInput">password : </label>
<input type="text" id="passwordInput" name="password">
</p>
<p>
<label for="passwordInput">hobby : </label>
music <input type="checkbox" id="passwordInput" name="hobby" value="music">
listen <input type="checkbox" id="passwordInput" name="hobby" value="listen">
running <input type="checkbox" id="passwordInput" name="hobby" value="running">
</p>
<p>
<input type="submit">
</p>
</form>
</body>
</html>
(2)后端
from django.shortcuts import render, HttpResponse, redirect
def register(request):
'''
前端发送数据给后端 --- 通过 form 表单
后端取出来做校验
:param request:
:return:
'''
# 第一次 GET 请求是你访问页面在地址栏回车的那个请求 ---> render 渲染了你的注册页面
# 第二次 GET 请求发生在你点击提交的时候,向后端提交数据
# print(request.method)
# 从请求中获取对应的数据
print(request.method)
# 通过 request.GET
# 从GET请求中获取数
print(request.GET)
# <QueryDict: {'username': ['silence'], 'password': ['741'], 'hobby': ['music', 'listen']}>
# 从GET请求中获取数据
username = request.GET.get("username")
password = request.GET.get("password")
# hobby = request.GET.get("hobby")
# silence 741 listen
hobby = request.GET.getlist("hobby")
# silence 741 ['music', 'listen']
print(username, password, hobby)
return render(request, "register.html")
from django.contrib import admin
from django.urls import path
from user.views import index, login,register
urlpatterns = [
path('admin/', admin.site.urls),
path('', index),
path('login/', login),
path('register/', register),
]
(3)总结
# 查看 get 请求数据是通过 request.GET
# 获取数据的方式 request.GET.get("key") ---> 获取单一键值时候的方式
# 获取数据的方式 request.GET.getlist("key") ---> 获取一个键对应多个值时候的方式
【2】提交POST请求
# POST 请求 发生错误 无法访问 CSRF verification failed. Request aborted.
# csrf 验证失败 ---> 注释掉一个中间件 ---> 取消了 csrf 验证
(1)前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>注册页面</h1>
{#form表单#}
<form action="" method="post">
{# action : 用来定义数据提交的路径的 不写 是默认当前请求地址 写了 指定的请求地址 #}
{# method : get 提交 get请求 post 提交 post 请求 #}
<p>
<label for="usernameInput">username : </label>
<input type="text" id="usernameInput" name="username">
</p>
<p>
<label for="passwordInput">password : </label>
<input type="text" id="passwordInput" name="password">
</p>
<p>
<label for="passwordInput">hobby : </label>
music <input type="checkbox" id="passwordInput" name="hobby" value="music">
listen <input type="checkbox" id="passwordInput" name="hobby" value="listen">
running <input type="checkbox" id="passwordInput" name="hobby" value="running">
</p>
<p>
<input type="submit">
</p>
</form>
</body>
</html>
(2)后端
# POST请求获取数据
# print(request.method)
# 只有 post 请求才会走的方式
from django.shortcuts import render, HttpResponse, redirect
if request.method == "POST":
# 通过 request.POST
print(request.POST)
# POST
# <QueryDict: {'username': ['silence'], 'password': ['741'], 'hobby': ['music', 'listen']}>
# 从POST请求中获取数据
username = request.POST.get("username")
password = request.POST.get("password")
# hobby = request.POST.get("hobby")
# silence 741 listen
hobby = request.POST.getlist("hobby")
# silence 741 ['music', 'listen']
print(username, password, hobby)
return render(request, "register.html")
(3)POST请求报错
- 当前端form表单发送POST请求时,会报一个错,导致后端崩溃
Forbidden (403)
CSRF verification failed. Request aborted.
You are seeing this message because this site requires a CSRF cookie when submitting forms. This cookie is required for security reasons, to ensure that your browser is not being hijacked by third parties.
If you have configured your browser to disable cookies, please re-enable them, at least for this site, or for “same-origin” requests.
(4)解决办法
- 将settings.py文件中的配置注释掉,在后面的学习中我们会逐步的解决掉这个问题
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 将这个配置先注释掉
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
【二】request对象属性和方法
【1】request.method
- 获取发起请求的请求方式
- get请求携带的数据是由大小限制的
- post请求携带的请求参数没有限制
【2】request.POST
- 获取用户输入的请求数据,但不包含文件
- 返回的是:大写字符串
【3】get/getlist
- get 只会获取列表最后一个元素
- getlist 直接将列表取出(多选项)
【三】如何获取url后面携带的数据

Ⅴ Django框架入门之ORM操作
【一】配置数据库
【1】默认数据库
- 在 settings.py 文件中有一个配置项就是配置数据库的
- 但是Django默认的数据库是sqlite3数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
【2】指定数据库
- 修改 settings.py 中的数据库配置项
- 模版
# 链接MySQL数据库
DATABASES = {
'default': {
# 指定我们使用的引擎是 mysql 数据库的引擎
'ENGINE': 'django.db.backends.mysql',
# 我们需要配置MySQL数据库的参数
# NAME 就是你要链接的数据库名字
# 'NAME': BASE_DIR / 'db.sqlite3',
# MySQL服务器的IP - HOST
"HOST": "127.0.0.1",
# MySQL服务器的PORT
"PORT": 3306,
# MySQL服务器的USERNAME
"USER": "root",
# MySQL服务器的PASSWORD
"PASSWORD": "123456",
# MySQL服务器的 数据库名字 NAME
# create database django_day02;
"NAME": "django_day02",
# MySQL服务器的CHARSET
"CHARSET": "utf8mb4"
}
}
【3】指定MySQL数据库报错
# 【遇到报错】
# django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
# Did you install mysqlclient?
- django 默认使用mysqldb模块链接mysql
- 但是该模块的兼容性不好,需要手动修改为pymysql链接
(1)解决办法一:猴子补丁
- 在项目下的 init 或者任意的应用名下的 init 文件中书写一下代码
import pymysql
pymysql.install_as_MySQLdb()
(2)解决办法二:下载第三方模块
pip install mysqlclient
(3)Win报错解决办法(下载whl文件)

- 下载对应的whl版本文件
- 安装(切换到指定目录下执行 pip 安装命令)
pip install pip mysqlclient-2.2.4-cp310-cp310-win_amd64.whl
(4)Mac报错解决办法
# 在MacOS上面安装 mysqlclient 100% 报错
# 解决方法也非常繁琐 ---> 需要安装很多东西 ---> 还是没安装上
# MacOS 选择打补丁
# 在MacOS上面装一个 windows 系统 ---> 安装一点问题没有
【pycharm链接数据库之下载数据库】

