Django后端开发学习笔记Django基本概念

Posted 梆子井欢喜坨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django后端开发学习笔记Django基本概念相关的知识,希望对你有一定的参考价值。

0. 学习参考

[1] MDN:Django Web 框架(python)
[2] mdn/django-locallibrary-tutorial

1. Django整体结构

在这里插入图片描述

  • URLs:
    虽然可以通过单个功能来处理来自每个URL的请求,但是编写单独的视图函数来处理每个资源是更加可维护的。URL映射器用于根据请求URL将HTTP请求重定向到相应的视图。URL映射器还可以匹配出现在URL中的字符串或数字的特定模式,并将其作为数据传递给视图功能。
  • View: 视图
    是一个请求处理函数,它接收HTTP请求并返回HTTP响应。视图通过模型访问满足请求所需的数据,并将响应的格式委托给 模板。
  • Models: 模型
    是定义应用程序数据结构的Python对象,并提供在数据库中管理(添加,修改,删除)和查询记录的机制。
  • Templates: 模板
    是定义文件(例如html页面)的结构或布局的文本文件,用于表示实际内容的占位符。一个视图可以使用HTML模板,从数据填充它动态地创建一个HTML页面模型。可以使用模板来定义任何类型的文件的结构; 它不一定是HTML!

Django将此组织称为“模型视图模板(MVT)”架构。它与更加熟悉的 Model View Controller 架构有许多相似之处.

一个中文版的Django流程示意图,不记得出处了,抱歉。
在这里插入图片描述

2. 主要部分

2.1 将请求发送到正确的视图 (urls.py)

URL映射器通常存储在名为urls.py的文件中。在下面的示例中,mapper(urlpatterns)定义了特定URL 模式 和相应视图函数之间的映射列表。如果接收到具有与指定模式匹配的URL(例如r’^$’,下面)的HTTP请求,则将调用 相关联的视图功能(例如 views.index)并传递请求。

urlpatterns = [
    url(r'^$', views.index),
    url(r'^([0-9]+)/$', views.best),
]

urlpatterns是一个列表,支持用正则表达式匹配路径
字符串前加字母"r"表示后面字符串中不进行转义

2.2 处理请求 (views.py)

视图是Web应用程序的核心,从Web客户端接收HTTP请求并返回HTTP响应。在两者之间,他们编制框架的其他资源来访问数据库,渲染模板等。
下面的例子显示了一个最小的视图功能index(),可以通过上一节中的URL映射器调用。
像所有视图函数一样,它接收一个HttpRequest对象作为参数(request)并返回一个HttpResponse对象。

## filename: views.py (Django view functions)
from django.http import HttpResponse

def index(request):
    # Get an HttpRequest - the request parameter
    # perform operations using information from the request.
    # Return HttpResponse
    # 对请求不做任何事情,响应只是返回一个硬编码的字符串。
    return HttpResponse('Hello from Django!')

2.3 定义数据模型 (models.py)

  • 模型定义存储数据的结构,包括字段类型以及字段可能的最大值,默认值,选择列表选项,文档帮助文本,表单的标签文本等。
  • 模型的定义与底层数据库无关,可以选择其中一个数据库作为项目设置的一部分。
  • 一旦选择了要使用的数据库,就不需要直接与数据库通信。
  • 只需编写模型结构和其他代码,Django可以处理与数据库通信的所有辛苦的工作。

下面的代码片段为Team对象展示了一个非常简单的Django模型。
Team类将团队名称和团队级别定义为字符字段,并为每个记录指定了要存储的最大字符数。team_level 可以是几个值中的一个,因此将其定义为一个选择字段,并在被展示的数据和被储存的数据之间建立映射,并设置一个默认值。

# filename: models.py

from django.db import models 

class Team(models.Model): 
    team_name = models.CharField(max_length=40) 

    TEAM_LEVELS = (
         ('U09', 'Under 09s'),
         ('U10', 'Under 10s'),
         ('U11', 'Under 11s'),
         ...  #list other team levels
    )
    team_level = models.CharField(max_length=3,choices=TEAM_LEVELS,default='U11')

2.4 呈现数据 (HTML 模版)

因为打算使用前后端分离的方式,所以此部分略过。

3. 创建网站框架

以MDN教程中的本地图书管理系统为例

3.1 使用django-admin工具创建工程的文件夹,基本的文件模板和工程管理脚本(manage.py)。

mkdir locallibrary
cd locallibrary
django-admin startproject locallibrary
cd locallibrary

django-admin工具会创建如下所示的文件夹结构

locallibrary/
    manage.py
    locallibrary/
        settings.py
        urls.py
        wsgi.py
  • locallibrary项目的子文件夹是整个网站的进入点:
  • settings.py 包含所有的网站设置。这是可以注册所有创建的应用的地方,也是静态文件,数据库配置的地方,等等。
  • urls.py 定义了网站url到view的映射。虽然这里可以包含所有的url,但是更常见的做法是把应用相关的url包含在相关应用中。
  • wsgi.py 帮助Django应用和网络服务器间的通讯。你可以把这个当作模板。
  • manage.py脚本可以创建应用,和数据库通讯,启动开发用网络服务器。

3.2 用manage.py 创建一个或多个应用。

注意:一个网站可能由多个部分组成,比如,主要页面,博客,wiki,下载区域等。Django鼓励将这些部分作为分开的应用开发。如果这样的话,在需要可以在不同的工程中复用这些应用。

这里创建一个catalog应用
在locallibrary项目里,使用下面的命令创建catalog应用(和您项目的manage.py在同一个文件夹下)

python manage.py startapp catalog

这个工具创建了一个新的文件夹,并为该应用创建了不同的文件(下面黑体所示)。绝大多数文件的命令和它们的目的有关(比如视图函数就是views.py,模型就是models.py,测试是tests.py,网站管理设置是admin.py,注册应用是apps.py),并且还包含了为项目所用的最小模板。
执行命令后的文件夹结构如下所示:

locallibrary/
    manage.py
    locallibrary/
    catalog/
        admin.py
        apps.py
        models.py
        tests.py
        views.py
        __init__.py
        migrations/

除上面所说的文件外,还有:

  • 一个migration文件夹,用来存储“migrations”——当你修改你的数据模型时,这个文件会自动升级你的数据库。
  • init.py — 一个空文件,Django/Python会将这个文件作为Python 包并允许你在项目的其他部分使用它。

3.3 注册catalog应用

打开项目设置文件 locallibrary/locallibrary/settings.py 找到 INSTALLED_APPS 列表里的定义。 如下所示,在列表的最后添加新的一行。

INSTALLED_APPS = [
    'django.contrib.admin',      # 管理员站点
    'django.contrib.auth',       # 认证授权系统
    'django.contrib.contenttypes', # 内容类型框架
    'django.contrib.sessions', # 会话框架
    'django.contrib.messages', # 消息框架
    'django.contrib.staticfiles', # 管理静态文件的框架。
    'catalog.apps.CatalogConfig',  # 不要忘记注册自己创建的应用
]

新的这行详细说明了应用配置文件在 (CatalogConfig) /locallibrary/catalog/apps.py 里,当你创建应用时就完成了这个过程。

3.4 其它设置

先设置 TIME_ZONE 为你自己时区。

TIME_ZONE = 'Asia/Shanghai'
  • SECRET_KEY. 这个密匙值是Django网站安全策略的一部分。如果在开发环境中没有包好这个密匙,把代码投入生产环境时最好用不同的密匙代替。(可能从环境变量或文件中读取)。
  • DEBUG. 这个会在debug日志里输出错误信息,而不是输入HTTP的返回码。在生产环境中,它应设置为false,因为输出的错误信息会帮助想要攻击网站的人。

3.5 把URL映射留到它们相关的应用中

Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path(’’, Home.as_view(), name=‘home’)
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path(‘blog/’, include(‘blog.urls’))

将带有 catalog/ 的请求转发到模块 catalog.urls (使用相对路径 URL /catalog/urls.py)。

# Use include() to add paths from the catalog application
from django.conf.urls import include
from django.urls import path

urlpatterns += [
    path('catalog/', include('catalog.urls')),
]

path() 中的路由是一个字符串,用于定义要匹配的URL模式。该字符串可能包括一个命名变量(尖括号中)
‘catalog//’。此模式将匹配如 /catalog/any_chars/ 的URL ,并将 any_chars 作为具有参数名称 id 的字符串传递给视图。

Q: 如何把网站的根URL(例:127.0.0.1:8000)重定向到该URL:127.0.0.1:8000/catalog/?
A: 使用一个特殊的视图函数(RedirectView)
当在 path() 函数中指定的URL模式匹配时(在这个例子中是根URL),它将新的相对URL作为其第一个参数重定向到(/catalog/)。

将以下行再次添加到文件的底部:

#Add URL maps to redirect the base URL to our application
from django.views.generic import RedirectView
urlpatterns += [
    path('', RedirectView.as_view(url='/catalog/')),
]

将路径函数的第一个参数留空以表示’/’。

3.6 运行数据库迁移

Django 使用对象关系映射器(ORM)将Django代码中的模型定义映射到底层数据库使用的数据结构。当我们更改模型定义时,Django会跟踪更改并创建数据库迁移脚本 (in /locallibrary/catalog/migrations/) 来自动迁移数据库中的底层数据结构来

当我们创建网站时,Django会自动添加一些模型供网站的管理部分使用。运
行以下命令来定义数据库中这些模型的表(确保你位于包含 manage.py 的目录中):

python manage.py makemigrations
python manage.py migrate

重要: 每次模型改变,都需要运行以上命令,来影响需要存储的数据结构(包括添加和删除整个模型和单个字段)。

4. 常用命令总结

创建项目

django-admin startproject mytestsite

创建app

python manage.py startapp catalog

数据库迁移

python manage.py makemigrations # 创建(但不适用)项目中安装的所有应用程序的迁移
python manage.py migrate # 明确应用迁移你的数据库(Django跟踪哪些已添加到当前数据库)。

运行服务器

python manage.py runserver
python manage.py runserver 0.0.0.0:8000 #指定ip和端口

以上是关于Django后端开发学习笔记Django基本概念的主要内容,如果未能解决你的问题,请参考以下文章

Django后端开发学习笔记Django REST Framework入门

Django后端开发学习笔记Django REST Framework入门

Django后端开发学习笔记:记录一些小问题

Django后端开发学习笔记URL调度器

Django后端开发学习笔记URL调度器

Django后端开发学习笔记Django REST Framework基于类的视图