自学Python第二十二天- Django框架(一)创建项目、APP、快速上手、请求和响应流程、模板、数据库操作

Django 框架是一个基于 python 的重量级的 web 开发框架,现今很多大公司大项目都是使用 Django 框架。采用了 MVC(model view controller) 的框架模式,python 中此模式也被称为 MTV(model template view) 模式。

可以使用 pip install django 来安装 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:nameapp_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就失效了,需要我们自己设置静态路径。

  1. 打开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')
  1. 在 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}))
  1. 因为生产环境中不会轮流从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 包的

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值