Django 框架是一个基于 python 的重量级的 web 开发框架,现今很多大公司大项目都是使用 Django 框架。采用了 MVC(model view controller) 的框架模式,python 中此模式也被称为 MTV(model template view) 模式。
可以使用 pip install django
来安装 Django 库
创建项目
可以通过终端和 pycharm 两种方式来创建项目,区别是 pycharm 创建的项目会额外添加了一些模板信息。
在终端创建项目
Django 创建项目有点类似于 Scrapy ,在要创建项目的文件夹下,使用终端(命令行)输入命令。django_admin.exe 是在 python 下的 Scripts 下,默认添加到了环境变量中,所以可以直接执行。
django-admin startproject 项目名称
执行完成后,会在当前目录下创建一个项目名称命名的文件夹。这样项目就创建成功了。
pycharm 创建项目
在 pycharm 中新建项目时,选择 Django 项目,即可创建 Django 项目了。需要注意的是,需使用企业版的 pycharm。
默认项目文件
创建完成的项目目录结构为(learnDjango是项目名称,也是主工程目录):
learnDjango
│ manage.py
│
└─ learnDjango
asgi.py
settings.py
urls.py
wsgi.py
__init__.py
- manage.py 负责项目的管理,包括启动项目、创建app、数据管理等
- asgi.py 异步接收网络请求
- wsgi.py 同步接收网络请求
- urls.py URL和处理函数的对应关系(总路由)
- settings.py 项目的配置文件
配置项目
可以在主工程目录下的 settings.py 中进行项目配置
- BASE_DIR : 基础目录,除非特殊情况不推荐更改
- SECRET_KEY : 安全密钥,默认不用更改
- DEBUG : 是否启动 debug 模式,开发环境可以选是,生产环境选否
- ALLOWED_HOSTS : 允许访问的主机地址,默认为空,即全部
- INSTALLED_APPS : 安装(注册)的应用(app)
- MIDDLEWARE : 使用的中间件
- ROOT_URLCOMF : 根路由配置文件,默认工程目录下的 urls.py
- TEMPLATES : 模板配置信息,使用默认不用更改
- WSGI_APPLICATION : WSGI 通信应用,除非特殊情况不推荐更改
- DATABASES : 数据库信息,可以根据需要使用的数据库进行更改
- AUTH_PASSWORD_VALIDATORS : 密码校验控件,不用更改
- LANGUAGE_CODE : 语言,英文使用
en-us
,中文使用zh-hans
- TIME_ZONE : 当前时区,不用更改(也可以改为当地时区,例如
Asia/Shanghai
) - USE_I18N : 是否支持国际化,不用更改
- USE_TZ : 是否使用 UTC 时区,不用更改
- STATIC_URL : 静态资源URL路径,不用更改
- STATICFILES_DIRS : 这是一个列表,当静态资源目录比较多时,可以在这里进行添加
- MEDIA_URL : 媒体文件URL路径(自定义的配置项)
- MEDIA_ROOT : 媒体文件保存的物理路径目录(自定义的配置项),例如
os.path.join(BASE_DIR, 'media')
- DEFAULT_AUTO_FIELD : 默认主键字段类型,不用更改
APP
一个项目下可以有 N 个独立的 app 来处理不同的功能,每个 app 可以拥有独立的、不同的表结构、函数、HTML模板、CSS等。
创建 app
终端里,创建好的项目文件夹下,带参数运行 manage.py 即可创建一个新的 app:
python manage.py startapp app名称
app 的文件结构
app 的目录结构为(app01是app的名称)
app01
│ admin.py
│ apps.py
│ models.py
│ tests.py
│ views.py
│ __init__.py
│
└─migrations
__init__.py
- migrations 记录 Django 的 model 对数据库进行的变更
- tests.py 进行单元测试
- admin.py django 默认提供的 admin 后台管理
- app.py app的启动设置
- views.py URL执行的函数(视图函数)
- models.py 操作数据库
app 的配置
当创建好 app 后,在 app 的目录下有 apps.py ,这里注册了 app 的一些配置信息。例如
- default_auto_field : 数据模型的自动字段类
- name : app 的名称
如果在 app 加载完成后执行一些代码,例如初始化 app 数据,或设置一些信号钩子等,可以重写 app 类的 ready()
方法
from django.apps import AppConfig
class TestappConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'testapp'
def ready(self):
super().ready() # 运行基类的 ready() 方法
# 这里可以添加一些需要在 app 加载完成后执行的代码
快速上手
当创建了项目和app之后,到应用启动还需要注意以下几点:
- 确保 app 类已经注册
在 app 目录下的 apps.py 中能看到类名称,通常是 app项目名+Config。将此类名称添加到 settings.py 里的 INSTALLED_APPS 列表中即可。需注意的是添加目录名、文件名和启动类名,例如 ‘app01.apps.App01Config’。在新版本的django中,在 INSTALLED_APPS 列表中只添加 app 名称即可。
- 编写 URL 和视图函数的对应关系(路由及处理函数)
在 urls.py 中编写对应关系。添加到 urlpatterns 列表中,格式为
path('路由路径', 函数名)
。例如 path(‘index/’, views.index)。另外注意的是,需要导入 views.py 文件。
- 编写视图函数
在 views.py 中编写视图函数。需注意的是,视图函数默认需有形参 request。例如:
from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
return HttpResponse("初学 Django")
- 有登录需要的创建超级管理员,可以查看之后的权限与后台管理
启动 django 项目
终端启动
在终端中输入 python manage.py runserver
来启动 django 服务,使用 ctrl + c 来结束服务。也可以添加参数,来确定访问地址。例如
python manage.py runserver 0:8000
python manage.py runserver 0.0.0.0:8000
就表示可用IP为 0.0.0.0 ,端口为 8000
pycharm 启动
使用 pycharm 建立的 django 项目可以通过默认启动项直接启动,默认快捷键是 shift + F10
通过 python 脚本启动
如果需要由其他的 python 脚本调用启动 django 服务,可以使用这种方法:
# 创建文件和 manage.py 放在一起,可以参考 manage.py 的内容。调用 run_django 即可启动 django 服务
from django.core.management import execute_from_command_line
def run_django():
# 添加 Django 的设置环境,第二个参数指向工程目录的 settings.py
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Django.settings')
# 执行运行的指令,是个列表,可以更改 ip 和端口
execute_from_command_line(['manage.py', 'runserver', '0.0.0.0:9600'])
注册路由和路径传参
路由及相应的视图处理函数在工程目录(与项目同名的文件夹)下的 urls.py 中注册(或在 app 目录下的 urls.py 中进行注册,这种叫做子路由,方式及语法同主路由,只是需要在主路由中进行注册)主路由,注册到 urlpatterns 下。 urlpatterns 是一个列表,每个成员是一个 partial 类。
可以由 path()
方法创建,路由地址及视图处理函数作为参数,注意 django 中的路由都不用反斜杠(/)起始
from django.urls import include
urlpatterns = [
path('', views.login),
# 子路由需要在主路由中进行注册
path('user/', include('app.urls')) # 所有 user 下的路由使用子路由,子路由不需要注册上级路由
path('index', views.index)
]
也可以使用正则表达式
# 此种方法为老版本的 django,4.0以后已经废除!!!!!
from django.conf.urls import url
urlpatterns = [
url(r'^hi/(?P<name>\w+)$', views.hello),
]
# 此种方式会使用路径传参,将匹配正则的参数以关键参数 name 传入视图处理函数
# 如果不指定关键参数传值,则会按照括号的顺序传值
# 需注意的是传参必须使用括号,视图处理函数必须接收参数
或者
# 新版本 django 支持的方式,使用 re_path 方法
from django.urls import path, re_path
urlpatterns = [
path('', views.login),
re_path(r'hi/(\w+)/(\d{4})', views.hello),
]
反向解析路由
注册路由时,使用 path 方法注册视图处理函数(或注册子路由)。在注册时其实有一个参数来定义名称(或命名空间):
from django.urls import include
app_name = 'app' # 注意将当前 app 注册名称
urlpatterns = [
path('', views.login, name=None),
# 子路由需要在主路由中进行注册
path('user/', include('app.urls', namespace='user')) # 所有 user 下的路由使用子路由,子路由不需要注册上级路由
path('index', views.index, name='index')
]
可以通过定义的名称或命名空间来反向解析路由路径。需要注意的是,使用子路由时,需要定义 app_name (一般在app 的 urls.py 中),否则会报错。反向解析路由字符串为 namespace:name
或 app_name:name
在模板中使用反向解析路由
在模板中,可以使用 {% url %} 结构来获取反向解析路由,语法为 {% url 反向解析路由字符串 参数1 参数2 %},参数可以是多个,使用空格分隔,默认位置传参,也可以使用关键参数传参。例如
<a href="{% url 'user:list' id=1 5 %}">链接</a>
需注意的是,反向解析路由字符串是由 urls.py 中的 app_name、namespace、和 name 定义的字符串组成的。传递的参数是路径传参的形式,不是 GET 参数形式。
在视图函数中使用反向解析路由
在视图函数中,使用 reverse()
函数来反向解析路由路径。然后可以使用 redirect 或 RedirectHttpResponse 来重定向。传递的参数也是路径传参
from django.urls import reverse
url = reverse('user:list',args=('id',5))
也可以使用字典传递关键字参数
from django.urls import reverse
url = reverse('user:list', kwargs=dict(id=1, page=5))
templates 模板
在视图函数中使用 render()
方法可以返回 html 页面
def index(request):
return render(request, 'index.html')
默认情况下 django 会在 app 目录下的 templates 目录下来查找需要使用的 html 页面文件。
需要注意的是,django 并不是在当前 app 的 templates 目录下寻找,而是根据 app 的注册顺序,查找相应 app 目录下的 templates 目录下查找 html 文件。
另外,可以在项目 settings.py 文件中的 TEMPLATES 字段下的 ‘DIRS’ 添加参数 [os.path.join(BASE_DIR, 'templates')]
,则优先在项目根目录下的 templates 目录下查找 html 文件。
静态文件
在开发过程中,一般将图片、CSS、js 等作为静态文件处理。django 会将静态文件存放在 app 目录下的 static 文件夹下。html 指向静态文件时使用相对路径,例如 src="/static/1.png"
。所以一般 static 目录下会创建 img、js、css、plugins 等文件夹存放相应的静态文件。
不过 django 推荐这样使用静态资源:
{% load static %}
<link rel="stylesheet" href="{% static 'plugins/bootstrap-5.1.3-dist/css/bootstrap.css' %}">
如果需要更改 static 目录,则在 settings.py 文件里的 STATIC_URL(静态文件的 url 地址) 和 STATICFILES_DIRS(静态文件的物理地址) 里更改。
# setting.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, app_name, 'static')
for app_name in INSTALLED_APPS if os.path.isdir(os.path.join(BASE_DIR, app_name, 'static'))
]
静态文件 favicon.ico 的调用
浏览器会经常访问django获取 favicon.ico
,用于显示浏览器标签图标。设置好静态路径后,可以保存一个图标到静态目录(可以是非 app 的静态文件夹)例如项目目录下的 static 下,然后在 urls.py 中添加路由:
# urls.py
from django.contrib.staticfiles import views
urlpatterns = [
...
path('favicon.ico', views.serve, {
'path': 'img/favicon.ico'}), # 即ico文件为 static/img/favicon.ico
]
这种在开发模式中可以使用,生产模式中因为通常静态资源是由 nginx 之类的负责,所以 django 没有相应配置。但是可以通过修改页面模板的方式指定所要访问的静态资源。
{% load static %}
<head>
<link rel="shortcut icon" href="{% static 'img/favicon.ico' %}" type="image/x-icon">
</head>
生产环境下使用静态文件
在开发环境中(DEBUG=True)
,django.contrib.staticfiles 会自动帮助寻找静态路径。在生产环境中(DEBUG=False)
,django.contrib.staticfiles就失效了,需要我们自己设置静态路径。
- 打开settings.py,把STATIC_URL 和 STATICFILES_DIRS 注释掉,新增STATIC_ROOT
# settings.py
DEBUG = False
STATIC_URL = '/static/' # 静态资源 url 地址
if DEBUG: # 开发模式
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'), # 配置非 app 绑定的静态资源路径,后面逗号一定要加
]
else: # 生产模式起作用
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
- 在 url.py 中新增静态文件路由
开发环境使用:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
if settings.DEBUG:
urlpatterns += staticfiles_urlpatterns()
# 也有使用下面这种方式
# urlpatterns += static(settings.STATIC_URL, document_root=settings.STATICFILES_DIRS)
生产环境使用:
from django.views.static import serve
urlpatterns.append(re_path(r"^static/(?P<path>.*)$", serve, {
'document_root': settings.STATIC_ROOT}))
- 因为生产环境中不会轮流从app中查找静态文件,所以要进行静态文件迁移,将所有注册APP绑定的静态文件迁移到 STATIC_ROOT 的目录中
python manage.py collectstatic
自定义静态资源 MEDIA
如果使用了自定义的静态资源,例如用户上传文件 MEDIA ,则除了需要在 settings.py 中进行配置(例如 MEDIA_URL 和 MEDIA_ROOT)外,还需要在 urls.py 中进行注册。
# setting.py
MEDIA_URL = '/upload/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'upload'),
开发环境下的设置
# urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
生产环境下的路径配置
urlpatterns.append(re_path(r"^media/(?P<path>.*)$", serve, {
'document_root': settings.MEDIA_ROOT}))
在前端中,可以使用 {
{ MEDIA_URL }}
来获取 MEDIA 的url路径。例如
<img id="Img" class="Img" src="{
{ MEDIA_URL }}img/img.jpg"/>
但是需要在 settings.py 中的模板项里添加定义:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
.
.
.
'django.template.context_processors.media', # 添加这一行
],
},
},
]
在视图函数中,可以使用 from django.conf import settings
包的