包含项目展示(DRF+React+MySQL8前后端分离)、《Django3 Web应用开发实战-黄永祥》和一些优秀文章的笔记。
项目展示-DRF+React前后端分离
在Jane167的volunteerSystem项目的基础上进行学习修改。
- 后端:
技术:DRF(Django REST Framework)、Django、MySQL、drf-yasg、django-cors-headers等。
主要的修改:Django版本由2升级为4、新增跨域等相关模块,并解决相应问题。 - 前端:
技术:React、@umijs/max、Ant Design Pro、ProComponents、typescript。
主要的修改:修改跨域相关代码,关闭国际化插件,SettingDrawer 动态设置等。(该项目在表单校验等还需要优化,有些模块需要删减,不然安装启动比较慢) - 环境:
python3
数据库:MySQL8.0.30
免费数据库工具:DBeaver CommunityMySQL
单击“开始”菜单,在搜索框中输入cmd,以管理员身份运行该服务,
使用net start
命令查看所有正在运行的服务,其中包括MySQL服务。
- 启动MySQL:
net start mysql
- 从命令行中连接 mysql 服务器:
mysql -u root -p
按照提示输入密码,并按下 Enter 键。在登录成功后会出现 mysql> 命令提示窗口,你可以在上面执行任何 SQL 语句。(不要忘记使用MySQL时在命令后加;)
列出所有可用的数据库:show databases;
创建数据库volunteersys:create database volunteersys;
。
退出:exit
。
根据实际情况修改project-drf中settings.py的DATABASES字段。 - DBeaver
MySQL启动后使用DBeaver连接MySQL,新建volunteersys数据库。
DBeaver连接MySQL报错:Public Key Retrieval is not allowed。(不允许检索公钥)。出现这个问题原因是:mysql8以上版本默认使用 sha256_password 认证,密码在传输过程中必须加密保护,如果无法使用 TLS,就需要使用 RSA 公钥加密。
解决:在驱动属性里设置 allowPublicKeyRetrieval 的值为 true。 - 关闭MySQL:
net stop mysql
。后端project-drf
虚拟环境,安装模块
1234567891011pip install pipenv检测安装是否成功pipenv --version预览一下pipenv的用法pipenv --help到项目根目录创建环境 ,修改当前目录下Pipfile文件,将[source]下的url属性改成国内的源即可,"https://mirrors.aliyun.com/pypi/simple" or "https://pypi.tuna.tsinghua.edu.cn/simple"pipenv install进入虚拟环境。在虚拟环境中运行以下命令pipenv shell安装文件中所包含的所有模块pipenv install django djangorestframework drf-yasg babel xlwt django-cors-headers cryptography pymysql
注意点:
平时安装和卸载包的时候不需要先进入或退出虚拟环境,直接在项目文件下pipenv install/uninstall xxx就行了。退出虚拟环境不要deactivate,请使用exit,否则下次pipenv进入的时候就会报错。
修改代码
- 跨域访问模块django-cors-headers
详细设置见下文“基于前后端分离与微服务架构的网站开发-设置跨域访问”。 - drf_yasg
使用drf_yasg生成Swagger API文档,相关代码请善用搜索引擎; pymysql
pymysql模块安装成功后,项目配置文件settings.py的数据库配置信息无须修改,只要在project_drf文件夹的__init__.py
中设置数据库连接模块即可。12import pymysqlpymysql.install_as_MySQLdb()re_path
django 4.0+ 已经把django.conf.urls.url() 废弃掉了。
用以下这句代码替换,这样,后面使用url的代码无需任何修改:from django.urls import re_path as url
替换from django.conf.urls import url
。解决django.core.exceptions.FieldError: Cannot resolve keyword ‘date_joined’ into field. Choices are:xxxx问题
123456789link/models.py:from django.contrib.auth.models import Userbelonging_user = models.ForeignKey(User,models.CASCADE)link/serializers.py:from django.contrib.auth.models import Userbelonging_user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())link/view.py :# queryset = Link.objects.all().order_by('-date_joined')queryset = Link.objects.all().order_by('-belonging_user__date_joined')修改setting配置文件
123456789101112131415REST_FRAMEWORK = {'DEFAULT_PERMISSION_CLASSES': [# 'rest_framework.permissions.IsAdminUser',],'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', # 添加这一行解决:django rest_framework 分页出现报错'PAGE_SIZE': 10}DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # 解决 DEFAULT_AUTO_FIELD warningsREST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework.authentication.TokenAuthentication', # 解决 DRF框架中csrf异常)}
迁移表
|
|
Dbeaver刷新可以看到新建出来的表。
创建超级管理员的账号和密码
在浏览器上输入127.0.0.1:8000/admin就能访问Admin后台系统。在访问Admin后台系统时,需要用户的账号和密码才能登录后台管理页面。创建用户的账号和密码之前,必须确保项目已执行数据迁移,在数据库中已创建相应的数据表。创建超级管理员的账号和密码,创建方法 由 Django 的内 置 指 令 createsuperuser 完 成,python manage.py createsuperuser
。
在后台管理页面,新建组、用户:
1: manager 管理员;
2: company 企业;
3: common 普通用户。
启动项目
pipenv run python manage.py runserver 8088
访问http://127.0.0.1:8088/swagger
前端project-react
前端根目录新建.env 配置端口3000
requirements.txt文件
作用:记录所有项目所依赖的第三方模块,方便迁移到不同的环境中,防止缺少模块,或因为所依赖的第三方模块不同而引起的一系列问题。
cd到项目根目录,然后通过以下方法:
- freeze命令(生成requirements.txt)
pip freeze > requirements.txt
,但会发现此时requirements.txt里的模块则是你电脑上所有安装的模块。因此,该方法仅适用单独的虚拟环境。比如你是在一个使用conda或pipenv或virtualenv新建的虚拟环境里面开发的项目,除项目依赖包以外无任何其它依赖包。参考Pycharm 中 virtualenv、pipenv、conda 虚拟环境的用法、Python多环境管理神器(pipenv)-doublexi、从pip+requirements.txt+virtualenv管理依赖到使用pipenv管理依赖-修改布署方式。 - 一键生成项目依赖包清单(pipreqs)
pip install pipreqs
,安装完成后,cd到项目根目录,运行下方命令即可生成依赖包清单:pipreqs ./ --encoding=utf-8
。pipreqs是对整个项目目录进行扫描,检测使用到的包,并添加进依赖包清单。如果项目文件较多的话,生成的速度可能会有点慢,请耐心等待一会儿,可能会有些偏差,需要检查并自己调整下。 - PyCharm中的requirements.txt文件—如何生成及导入
打开 Pycharm ,Tool 》Sync Python Requirements,根据步骤自动生成一个 requirements.txt 文件。
Settings/Preferences -> Tools | Python Integrated Tools. 选项 Package requirements file field 中填入 requirements.txt。 - 安装文件中所包含的所有模块的命令:
pip install -r requirements.txt
。创建项目
Django采用了MTV的框架模式,即模型(Model)、模板(Template)和视图(Views),三者之间各自负责不同的职责。
●模型:数据存取层,处理与数据相关的所有事务
●模板:表现层,处理与表现相关的决定
●视图:业务逻辑层,存取模型及调取恰当模板的相关逻辑,模型与模板的桥梁。
pycharm历史版本安装汉化等教程请善用搜索引擎(最好取消pycharm自动保存功能设置 )。 - PyCharm创建项目
PyCharm必须为专业版才能创建与调试Django项目,社区版是不支持此功能的 。项目创建后,可以看到目录结构多出了templates文件夹,该文件夹用于存放HTML模板文件。完成项目和App的创建后,启动项目。如果项目是由PyCharm创建的,就直接单击“运行”按钮启动项目。如果项目是在命令提示符窗口创建的,想要在PyCharm启动项目,而PyCharm没有运行脚本,就需要对该项目创建运行脚本。 - 命令提示符窗口创建项目
django-admin 是用于管理Django 的命令行工具集,当我们成功安装 Django 后,在操作系统中就会有这个命令。指令 的 使 用 方 法可以参考官方文档django-admin 和 manage.py。
打开命令提示符窗口,输入项目创建指令:django-admin startproject MyDjango
,在当前路径下创建Django项目,指令中的“MyDjango”是项目名称,可自行命名。项目创建后,可以看到新创建的文件夹MyDjango,在PyCharm下查看该项目的结构。
MyDjango项目里包含MyDjango文件夹和manage.py文件,而MyDjango文件夹又包含5个.py文件。项目的各个文件说明如下:
●manage.py:命令行工具,内置多种方式与项目进行交互。将路径切换到MyDjango项目并输入python manage.py help
,可以查看该工具的指令信息。
●__init__.py
:初始化文件,一般情况下无须修改。
●asgi.py:开启一个ASGI服务,ASGI是异步网关协议接口。
●settings.py:项目的配置文件,项目的所有功能都需要在该文件中进行配置。
●urls.py:项目的路由设置,设置网站的具体网址内容。
●wsgi.py:全称为Python Web Server Gateway Interface,即Python服务器网关接口,是Python应用与Web服务器之间的接口,用于Django项目在服务器上的部署和上线,一般不需要修改。
完成项目的创建后,接着创建项目应用,项目应用简称为App,相当于网站功能,每个App代表网站的一个功能。App的创建由文件manage.py实现,创建指令如下:python manage.py startapp index
创建,其中index是应用的名称,可自行命名。项目新建了index文件夹,其可作为网站首页。在index文件夹可以看到有多个.py文件和migrations文件夹,说明如下:
●migrations:用于生成数据迁移文件,通过数据迁移文件可自动在数据库里生成相应的数据表。●__init__.py
:index文件夹的初始化文件。●admin.py:用于设置当前App的后台管理功能。●apps.py:当前App的配置信息,在Django 1.9版本后自动生成,一般情况下无须修改。●models.py:定义数据库的映射类,每个类可以关联一张数据表,实现数据持久化,即MTV里面的模型(Model)。●tests.py:自动化测试的模块,用于实现单元测试。●views.py:视图文件,处理功能的业务逻辑,即MTV里面的视图(Views)。完成项目和App的创建后,最后在命令提示符窗口输入以下指令启动项目:python manage.py runserver 8001
,其中8001是端口号,如果在指令里没有设置端口,端口就默认为8000。最后在浏览器上输入 http://127.0.0.1:8001/ 可看到项目的运行情况。实现简单的Hello World网页
首先在templates文件夹里新建index.html文件,该文件是Django的模板文件,如果MyDjango项目是在命令提示符窗口下创建的,就需要在MyDjango项目的路径下自行创建templates文件夹,接着打开MyDjango文件夹的配置文件settings.py,找到配置属性INSTALLED_APPS和TEMPLATES,分别将项目应用index和模板文件夹templates添加到相应的配置属性,其配置如下12345INSTALLED_APPS 最后一行添加:# 添加项目应用index'index',TEMPLATES 添加:'DIRS': [BASE_DIR/'templates'],
最后在项目的urls.py(MyDjango文件夹的urls.py)、views.py(项目应用index的views.py文件)和index.html(templates文件夹的index.html)文件里编写相应的代码,即可实现简单的HelloWorld网页,代码如下:
启 动 MyDjango 项 目 ,并在浏览器上访问路由地址 (http://127.0.0.1:8000) 即可看到Hello World网页。由于Django默认配置的数据库是SQLite,因此在启动MyDjango项目之后,在MyDjango的目录里自动新建db.sqlite3文件。
Django配置信息
基本配置信息
settings.py的基本配置如下:
项目路径BASE_DIR:主要通过os模块读取当前项目在计算机系统的具体路径,该代码在创建项目时自动生成,一般情况下无须修改。
密钥配置SECRET_KEY:这是一个随机值,在项目创建的时候自动生成,一般情况下无须修改。主要用于重要数据的加密处理,提高项目的安全性,避免遭到攻击者恶意破坏。密钥主要用于用户密码、CSRF机制和会话Session等数据加密。
调试模式DEBUG:该值为布尔类型。如果在开发调试阶段,那么应设置为True,在开发调试过程中会自动检测代码是否发生更改,根据检测结果执行是否刷新重启系统。如果项目部署上线,那么应将其改为False,否则会泄漏项目的相关信息。
域名访问权限ALLOWED_HOSTS:设置可访问的域名,默认值为空列表。当DEBUG为False时,ALLOWED_HOSTS为必填项,否则程序无法启动,如果想允许所有域名访问,可设置ALLOW_HOSTS = [‘*’]。
App列表INSTALLED_APPS:告诉Django有哪些App。在项目创建时已有admin、auth和sessions等配置信息,这些都是Django内置的应用功能,各个功能说明如下:●admin:内置的后台管理系统。●auth:内置的用户认证系统。●contenttypes:记录项目中所有model元数据(Django的ORM框架)。●sessions:Session会话功能,用于标识当前访问网站的用户身份,记录相关用户信息。●messages:消息提示功能。●staticfiles:查找静态资源路径。如果在项目中创建了App,就必须在App列表INSTALLED_APPS添加App名称。
资源文件配置
资源文件配置分为静态资源和媒体资源。静态资源的配置方式由配置属性STATIC_URL、STATICFILES_DIRS和STATIC_ROOT进行设置;媒体资源的配置方式由配置属性MEDIA_URL和MEDIA_ROOT决定。
- 资源路由——STATIC_URL
静态资源指的是网站中不会改变的文件。在一般的应用程序中,静态资源包括CSS文件、JavaScript文件以及图片等资源文件。默认情况下,Django只能识别项目应用App的static文件夹里面的静态资源。当项目启动时,Django会从项目应用 App 里 面 查 找 相 关 的 资 源 文 件 , 查找 功 能 主 要 由 App 列 表INSTALLED_APPS的staticfiles实现。若资源路由STATIC_URL的值为/static/,则浏览器访问静态资源的网站必须为static,否则无法访问,并且Django在调试模式(DEBUG=True)下只能识别App目录下的static文件夹。 - 资源集合——STATICFILES_DIRS
STATICFILES_DIRS属性以列表的形式表示,设置方式如下:# 设置根目录的静态资源文件夹static STATICFILES_DIRS = [BASE_DIR / 'static',# 设置App(index)的静态资源文件夹Mystatic BASE_DIR / 'index/Mystatic',]
。 - 资源部署——STATIC_ROOT
其作用是在服务器上部署项目,实现服务器和项目之间的映射。STATIC_ROOT主要收集整个项目的静态资源并存放在一个新的文件夹,然后由该文件夹与服务器之间构建映射关系。当项目的配置属性DEBUG设为True的时候,Django会自动提供静态文件代理服务,此时整个项目处于开发阶段,因此无须使用STATIC_ROOT。当配置属性DEBUG设为False的时候,意味着项目进入生产环境,Django不再提供静态文件代理服务,此时需要在项目的配置文件中设置STATIC_ROOT。 - 媒体资源——MEDIA
# 设置媒体路由地址信息 MEDIA_URL = '/media/' # 获取media文件夹的完整路径信息 MEDIA_ROOT = BASE_DIR / 'media'
,配置属性设置后,还需要将media文件夹注册到Django里,打开urls.py文件,为媒体文件夹media添加相应的路由地址。123456from django.urls import path,re_path# 配置媒体文件夹mediafrom django.views.static import servefrom django.conf import settings## urlpatterns 新增re_path('media/(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT},name='media'),
模板配置
模板是Django里面的MTV框架模式的T部分,配置模板路径是告诉Django在解析模板时,如何找到模板所在的位置。创建项目时,Django已有初始的模板配置信息,模板配置通常配置DIRS的属性值即可。
数据库配置
数据库配置是选择项目所使用的数据库的类型,不同的数据库需要设置不同的数据库引擎,数据库引擎用于实现项目与数据库的连接,Django提供4种数据库引擎:django.db.backends.postgresql;django.db.backends.mysql;django.db.backends.sqlite3;django.db.backends.oracle
项目创建时默认使用Sqlite3数据库,这是一款轻型的数据库,常用于嵌入式系统开发,而且占用的资源非常少。
mysqlclient和pymysql模块实现Django与MySQL数据库通信连接。使用mysqlclient连接MySQL数据库时,Django对mysqlclient版本有使用要求,打开Django的源码查看mysqlclient的版本要求,一般情况下,使用pip安装mysqlclient模块就能符合Django的使用要求。如果在开发过程中发现Django提示mysqlclient过低,那么可以对Django的源码进行修改,将if条件判断注释即可。pymysql模块的安装使用pip在线安装即可,在命令提示符窗口下输入pip install pymysql
指令并等待安装完成即可。pymysql模块安装成功后,项目配置文件settings.py的数据库配置信息无须修改,只要在MyDjango文件夹的__init__.py
中设置数据库连接模块即可。
因为Django自带内置功能,如Admin后台系统、Auth用户系统和会话机制等功能,这些功能都需要借助数据表实现,所以python manage.py migrate
指令可以将内置的迁移文件生成数据表。
值得注意的是,如果使用的MySQL是8.0以上版本,在 Django 连 接 MySQL 数 据 库 时 会 提 示django.db.utils.OperationalError的错误信息,这是因为MySQL 8.0版本的密码加密方式发生了改变,8.0版本的用户密码采用的是CHA2加密方式。通过SQL语句将8.0版本的加密方式改回原来的加密方式,这样可以解决Django连接MySQL数据库的错误问题。
在配置属性DATABASES里设置多对键值对即可实现多个数据库连接。在大多数情况下,我们都是在settings.py中配置数据库的连接方式,但每次修改settings.py的配置属性都要重新启动Django,否则修改内容就无法生效。当项目运行上线之后,为了保证在系统不中断的情况下切换到另一个数据库,可以将数据库的连接方式写到配置文件中,这样无须修改settings.py的配置属性即可达成顺利切换数据的目的。创建配置文件my.cnf,然后在配置文件my.cnf写入MySQL数据库的连接信息,配置文件my.cnf中必须设置[client],[client]在配置信息中代表分组的意思,它是将一个或多个配置信息划分到某一个分组里面。下一步在Django的配置文件settings.py中编写DATABASES的配置信息,只需在default->OPTIONS->read_default_file设置配置文件my.cnf的地址路径即可,Django会自动读取配置文件my.cnf的数据库连接信息,从而实现数据库连接。注意:路径中不要出现中文。
通过SSH隧道远程连接MySQL:首先使用pip指令下载sshtunnel模块,该模块能通过SSH方式连接到目标服务器,生成服务器的SSH连接对象,然后在Django的配置文件settings.py的DATABASES中设置数据库连接。
中间件
中间件(Middleware)是一个用来处理Django的请求(Request)和响应(Response)的框架级别的钩子,它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。开发者可以根据自己的开发需求自定义中间件,只要将自定义的中间件添加到配置属性MIDDLEWARE中即可激活。配置属性MIDDLEWARE的数据格式为列表类型,每个中间件的设置顺序是固定的,如果随意变更中间件,就很容易导致程序异常。每个中间件的说明如下:●SecurityMiddleware:内置的安全机制,保护用户与网站的通信安全。●SessionMiddleware:会话Session功能。●LocaleMiddleware:国际化和本地化功能。●CommonMiddleware:处理请求信息,规范化请求内容。●CsrfViewMiddleware:开启CSRF防护功能。●AuthenticationMiddleware:开启内置的用户认证系统。●MessageMiddleware:开启内置的信息提示功能。●XFrameOptionsMiddleware:防止恶意程序单击劫持。
初探路由
路由基本编写规则如下(以MyDjango文件夹的urls.py为例):
●from django.contrib import admin:导入内置Admin功能模块。●from django.urls import path,include:导入Django的路由功能模块。●urlpatterns:代表整个项目的路由集合,以列表格式表示,每个元素代表一条路由信息。路由文件urls.py的路由定义规则是相对固定的,路由列表由urlpatterns表示,每个列表元素代表一条路由。路由是由Django的path函数定义的,该函数的第一个参数是路由地址,第二个参数是路由所对应的处理函数(视图函数或视图类),这两个参数是路由定义的必选参数。路由的变量类型有字符类型、整型、slug和uuid,最为常用的是字符类型和整型。字符类型:匹配任何非空字符串,但不含斜杠。如果没有指定类型,就默认使用该类型。整型:匹配0和正整数。路由的正则表达式是由路由函数re_path定义的,其作用是对路由变量进行截取与判断,正则表达式是以小括号为单位的,每个小括号的前后可以使用斜杠或者其他字符将其分隔与结束。
命 名 空 间 namespace 可 以 为 我 们 快 速 定 位 某 个 项 目 应 用 的urls.py,再结合路由命名name就能快速地从项目应用的urls.py找到某条路由的具体信息,这样就能有效管理整个项目的路由列表。
FBV视图
使用视图函数处理HTTP请求,即在视图里定义def函数,这种方式称为FBV(Function Base Views)。
Drf中的FBV视图:统一使用Response方法返回响应。DRF提供的@api_view这个非常重要的装饰器,实现了以下几大功能:1、与Django传统函数视图相区分,强调这是API视图,并限定了可以接受的请求方法。2、拓展了django原来的request对象。新的request对象不仅仅支持request.POST提交的数据,还支持其它请求方式如PUT或PATCH等方式提交的数据,所有的数据都在request.data字典里。这对开发Web API非常有用。
CBV视图
视图类功能封装了视图开发常用的代码,无须编写大量代码即可快速完成数据视图的开发,这种以类的形式实现响应与请求处理称为CBV(Class Base Views)。
Drf中的CBV视图:DRF的APIView类继承了Django自带的View类, 一样可以按请求方法调用不同的处理函数,比如get方法处理GET请求,post方法处理POST请求。不过DRF的APIView要强大得多。它不仅支持更多请求方法,而且对Django的request对象进行了封装,可以使用request.data获取用户通过POST, PUT和PATCH方法发过来的数据,而且支持插拔式地配置认证、权限和限流类。
模型与数据库
定义模型
ORM框架是一种程序技术,用于实现面向对象编程语言中不同类型系统的数据之间的转换。在Django中,虚拟对象数据库也称为模型,通过模型实现对目标数据库的读写操作,实现方法如下:
(1)配置目标数据库,在settings.py中设置配置属性。
(2)构建虚拟对象数据库,在App的models.py文件中以类的形式定义模型。
(3)通过模型在目标数据库中创建相应的数据表。
(4)在其他模块(如视图函数)里使用模型来实现目标数据库的读写操作。
Django划分了多种字段类型,在源码目录django\db\models\fields的__init__.py
和files.py文件里找到各种模型字段,说明如下:
●AutoField:自增长类型,数据表的字段类型为整数,长度为11位。●BigAutoField:自增长类型,数据表的字段类型为bigint,长度为20位。●CharField:字符类型。●BooleanField:布尔类型。●CommaSeparatedIntegerField:用逗号分隔的整数类型。●DateField:日期(Date)类型。●DateTimeField:日期时间(Datetime)类型。●Decimal:十进制小数类型。●EmailField:字符类型,存储邮箱格式的字符串。●FloatField:浮点数类型,数据表的字段类型变成Double类型。●IntegerField:整数类型,数据表的字段类型为11位的整数。●BigIntegerField:长整数类型。●IPAddressField:字符类型,存储Ipv4地址的字符串。●GenericIPAddressField:字符类型,存储Ipv4和Ipv6地址的字符串。●NullBooleanField:允许为空的布尔类型。●PositiveIntegerFiel:正整数的整数类型。●PositiveSmallIntegerField:小正整数类型,取值范围为0~32767。●SlugField:字符类型,包含字母、数字、下画线和连字符的字符串。●SmallIntegerField : 小 整 数 类 型 , 取 值 范 围 为 -32,768 ~+32,767。●TextField:长文本类型。●TimeField:时间类型,显示时分秒HH:MM[:ss[.uuuuuu]]。●URLField:字符类型,存储路由格式的字符串。●BinaryField:二进制数据类型。●FileField:字符类型,存储文件路径的字符串。●ImageField:字符类型,存储图片路径的字符串。●FilePathField:字符类型,从特定的文件目录选择某个文件。
每个模型字段都允许设置参数,这些参数来自父类Field,我们在源码里查看Field的定义过程(django\db\models\fields\__init__.py
)并且对模型字段的参数进行分析。
●verbose_name:默认为None,在Admin站点管理设置字段的显示名称。●primary_key:默认为False,若为True,则将字段设置成主键。●max_length:默认为None,设置字段的最大长度。●unique:默认为False,若为True,则设置字段的唯一属性。●blank:默认为False,若为True,则字段允许为空值,数据库将存储空字符串。●null:默认为False,若为True,则字段允许为空值,数据库表现为NULL。●db_index:默认为False,若为True,则以此字段来创建数据库索引。●default:默认为NOT_PROVIDED对象,设置字段的默认值。●editable:默认为True,允许字段可编辑,用于设置Admin的新增数据的字段。●serialize:默认为True,允许字段序列化,可将数据转化为JSON格式。●unique_for_date:默认为None,设置日期字段的唯一性。●unique_for_month:默认为None,设置日期字段月份的唯一性。●unique_for_year:默认为None,设置日期字段年份的唯一性。●choices:默认为空列表,设置字段的可选值。●help_text:默认为空字符串,用于设置表单的提示信息。●db_column:默认为None,设置数据表的列名称,若不设置,则将字段名作为数据表的列名。●db_tablespace:默认为None,如果字段已创建索引,那么数据库的表空间名称将作为该字段的索引名。注意:部分数据库不支持表空间。●auto_created:默认为False,若为True,则自动创建字段,用于一对一的关系模型。●validators:默认为空列表,设置字段内容的验证函数。●error_messages:默认为None,设置错误提示。上述参数适用于所有模型字段,但不同类型的字段会有些特殊参数,每个字段的特殊参数可以在字段的初始化方法init里找到。
在定义模型时,一般情况下都会重写函数str,这是设置模型的返回值,默认情况下,返回值为模型名+主键。需要注意的是,函数str只允许返回字符类型的字段,如果字段是整型或日期类型的,就必须使用Python的str()函数将其转化成字符类型。
模型除了定义模型字段和重写函数str之外,还有Meta选项,这三者是定义模型的基本要素。Meta选项里设有19个属性,每个属性的说明如下:●abstract:若设为True,则该模型为抽象模型,不会在数据库里创建数据表。●app_label:属性值为字符串,将模型设置为指定的项目应用,比如将index的models.py定义的模型A指定到其他App里。●db_table:属性值为字符串,设置模型所对应的数据表名称。●db_teblespace:属性值为字符串,设置模型所使用数据库的表空间。●get_latest_by:属性值为字符串或列表,设置模型数据的排序方式。●managed:默认值为True,支持Django命令执行数据迁移;若为False,则不支持数据迁移功能。●order_with_respect_to:属性值为字符串,用于多对多的模型关系,指向某个关联模型的名称,并且模型名称必须为英文小写。●ordering:属性值为列表,将模型数据以某个字段进行排序。●permissions:属性值为元组,设置模型的访问权限,默认设置添加、删除和修改的权限。●proxy:若设为True,则为模型创建代理模型,即克隆一个与模型A相同的模型B。●required_db_features:属性值为列表,声明模型依赖的数据库功能。●required_db_vendor:属性值为列表,声明模型支持的数据库,默认支持SQLite、PostgreSQL,MySQL和Oracle。●select_on_save:数据新增修改算法,通常无须设置此属性,默认值为False。●indexes:属性值为列表,定义数据表的索引列表。●unique_together:属性值为元组,多个字段的联合唯一,等于数据库的联合约束。●verbose_name:属性值为字符串,设置模型直观可读的名称并以复数形式表示。●verbose_name_plural:与verbose_name相同,以单数形式表示。●label:只读属性,属性值为app_label.object_name。● label_lower : 与 label 相 同 , 但其值为字母小写。
模型是以类的形式定义的,并且继承父类Model,但在使用模型操作数据库时,开发者直接使用即可,无须将模型实例化。
在项目index的models.py文件中定义模型,代码如下:1234567891011class PersonInfo(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=20)age = models.IntegerField()hireDate = models.DateField()def __str__(self):return self.nameclass Meta:verbose_name = '人员信息'数据迁移
数据迁移是将项目里定义的模型生成相应的数据表。首次在项目里定义模型时,项目所配置的数据库里并没有创建任何数据表,想要通过模型创建数据表,可使用Django的操作指令完成创建过程。下输入Django的操作指令:python manage.py makemigrations
当 makemigrations 指 令 执 行 成 功 后 , 在 项 目 应 用 index 的migrations文件夹里创建0001_initial.py文件,如果项目里有多个App,并且每个App的models.py文件里定义了模型对象,当首次执行makemigrations指令时,Django就在每个App的migrations文件夹里创建0001_initial.py文件。0001_initial.py文件将models.py定义的模型生成数据表的脚本代码,该文件的脚本代码可被migrate指令执行,migrate指令会根据脚本代码的内容在数据库里创建相应的数据表,只要在PyCharm的Terminal窗口下输入migrate指令即可完成数据表的创建,代码如下:python manage.py migrate
。指令运行完成后,打开数据库就能看到新建的数据表,其中数据表index_personinfo由项目应用index定义的模型PersonInfo创建,而其他数据表是Django内置的功能所使用的数据表,分别是会话Session、用户认证管理和Admin后台系统等。每次执行migrate指令时,Django都能精准运行migrations文件夹尚未被执行的.py文件,它不会对同一个.py文件重复执行,因为每次 执 行 时 , Django 会将 该 文 件 的 执 行 记 录 保 存 在 数 据 表django_migrations中。migrate指令还可以单独执行某个.py文件,首次在项目中使用migrate指令时,Django会默认创建内置功能的数据表,如果只想执行index的migrations文件夹的某个.py文件,那么可以在migrate指令里指定文件名。
在执行数据迁移之前,可以使用check指令检测整个项目,项目检测成功后再执行数据迁移操作,python manage.py check
。- 数据导入与导出
除了使用数据库可视化工具实现数据的导入与导出之外,Django还为我们提供操作指令(loaddata和dumpdata)来实现数据的导入与 导 出 操 作 。 - 数据表关系
一个模型对应数据库的一张数据表,但是每张数据表之间是可以存在外键关联的,表与表之间有3种关联:一对一、一对多和多对多。一对一关系存在于两张数据表中,在模型中可以通过OneToOneField来构建数据表的一对一关系;一对多关系存在于两张或两张以上的数据表中,在模型中可以通过ForeignKey来构建数据表的一对多关系;多对多关系存在于两张或两张以上的数据表中,在模型中可以通过ManyToManyField来构建数据表的多对多关系。 - 数据表操作
在PyCharm的Terminal下开启Shell模式,输入python manage.py shell
指令即可,该模式方便开发人员开发和调试程序。数据新增:由模型实例化对象调用内置方法实现数据新增,比如单数据新增调用create,查询与新增调用get_or_create,修改与新增调用update_or_create,批量新增调用bulk_create。●数据修改必须执行一次数据查询,再对查询结果进行修改操作 , 常 用 方 法 有: 模 型 实 例 化 、 update 方 法 和 批 量 更 新bulk_update。●数据删除必须执行一次数据查询,再对查询结果进行删除操作,若删除的数据设有外键字段,则删除结果由外键的删除模式决定。●数据查询分为单表查询和多表查询,Django提供多种不同查询的API方法,以满足开发需求。●执行SQL语句有3种方法实现:extra、raw和execute,其中extra和raw只能实现数据查询,具有一定的局限性;而execute无须经过ORM框架处理,能够执行所有SQL语句,但很容易受到SQL注入攻击。●数据库事务是指作为单个逻辑执行的一系列操作,这些操作具有原子性,即这些操作要么完全执行,要么完全不执行,常用于银行转账和火车票抢购等。
事 务 应 该 具 有 4 个 属 性 : 原 子 性 (Atomicity) 、 一 致 性(Consistency)、隔离性(Isolation)、持久性(Durability),这4个属性通常称为ACID特性。常用的函数方法如下:●atomic():在视图函数或视图类里使用事务。●savepoint():开启事务。●savepoint_rollback():回滚事务。●savepoint_commit():提交事务。
在查询数据时可以使用查询条件get或filter实现,但是两者的执行过程存在一定的差异,说明如下:
●查询条件get:查询字段必须是主键或者唯一约束的字段,并且查询的数据必须存在,如果查询的字段有重复值或者查询的数据不存在,程序就会抛出异常信息。●查询条件filter:查询字段没有限制,只要该字段是数据表的某一字段即可。查询结果以列表形式返回,如果查询结果为空(查询的数据在数据表中找不到),就返回空列表。 - 多数据库的连接与使用
单个Django项目连接多数据库的操作如下:●在配置文件settings.py里设置配置属性DATABASES,属性值以字典形式表示,字典的每个键值对代表连接某个数据库。●设置配置属性DATABASE_APPS_MAPPING,它以字典形式表示,每个键值对设置每个项目应用所使用的数据库,即数据库与项目应用的映射关系。●设置配置属性DATABASE_ROUTERS,它以列表形式表示,列表元素指向某个自定义类,该类根据数据库与项目应用的映射关系来设置数据库的读取、写入、数据表关系和数据迁移。● 在 MyDjango 文 件 夹 里 创 建 dbRouter.py 文 件 和 定 义DbAppsRouter类,该类是配置属性DATABASE_ROUTERS指向的自定义类。
单个Django项目连接并使用多数据库时需要注意以下几点:●模型之间建立外键关联必须保证它们所对应的数据表建立在同一个数据库。●定义模型时,可在Meta属性中设置app_label,这是将模型归属到某个项目应用,从而确定模型在哪个数据库里创建数据表。●执行数据迁移时,migrate指令必须设置参数,否则只为默认的数据库创建数据表。●无论连接单个数据库还是多个数据库,数据的读写方式都是相同的。
Django没有为我们提供动态创建模型和数据表的方法,因此需要在ORM的基础上进行自定义。 - MySQL分表功能
MySQL设有多种引擎,常用的引擎有InnoDB、MyISAM、Memory和ARCHIVE。MySQL数据库内置了分表功能,分表使用数据表引擎MyISAM实现。在Django中,ORM框架连接MySQL并创建数据表是默认使用InnoDB引擎,如果要使用数据表引擎MyISAM实现分表功能,必须自定义创建数据表。在实际开发中,如果数据表引擎没有特殊要求,建议使用InnoDB引擎,因为它更适合于日常的业务需求。Admin后台系统
Django已内置Admin后台系统,在创建Django项目的时候,可以从配置文件settings.py中看到项目已默认启用Admin后台系统,在INSTALLED_APPS中已配置了Admin后台系统,如果网站不需要Admin后台系统,就可以将配置信息删除,这样可以减少程序对系统资源的占用。此外,在MyDjango的urls.py中也可以看到Admin后台系统的路由信息,只要运行MyDjango并在浏览器上输入127.0.0.1:8000/admin就能访问Admin后台系统。在访问Admin后台系统时,需要用户的账号和密码才能登录后台管理页面。创建用户的账号和密码之前,必须确保项目已执行数据迁移,在数据库中已创建相应的数据表。创建超级管理员的账号和密码,创建方法 由 Django 的内 置 指 令 createsuperuser 完 成,python manage.py createsuperuser
。
整个Auth认证系统可分为三大部分:用户信息、用户权限和用户组,在数据库中分别对应数据表auth_user、auth_permission和auth_group。常见的Web应用程序
Django内置的会话控制简称为Session,可以为用户提供基础的数据存储。消息框架由中间件SessionMiddleware、MessageMiddleware和INSTALLED_APPS 的 django.contrib.messages 和django.contrib.sessions共同实现。消息提示定义了5种消息类型,每种类型设置了不同的级别。Django分页功能由Paginator类和Page类实现。Django Rest Framework框架
使 用 Django RestFramework框架实现API开发。使用框架开发不仅能减少代码冗余,还可以规范代码的编写格式。
DRF(Django REST Framework) 官网1234567# Install using pip...pip install djangorestframework# Add 'rest_framework' to your INSTALLED_APPS setting.INSTALLED_APPS = [...'rest_framework',]
Django Rest Framework框架的使用方式总结如下:
(1)在settings.py中添加Django Rest Framework功能,并对功能进行分页配置。
(2)在App中新建serializers.py文件并定义Serializer类或ModelSerializer类。
(3)在urls.py中定义路由地址。
(4)在views.py中定义视图函数,三种定义方式分别为:基于类的视图、基于函数的视图和重构ViewSets类。
序列化(Serialization)是将数据对象的状态信息形式转换为可存储或可传输形式的过程,转换后的数据可供其他应用程序使用。其中,重构ViewSets类的实现过程过于复杂,在开发过程中,如无必要,一般不建议采用这种实现方式。
Django Rest Framework提供的序列化器(Serializer)可以将复杂的数据(如查询集、模型实例、普通类实例)转换为可供前端使用的JSON、XML等格式的数据。同时,序列化器提供了反序列化功能,可以将前端发送的JSON、XML等格式的复杂数据转换为后端能接受的数据,并对发送的数据进行合法性验证。DRF的序列化器主要通过Serializer类和ModelSerializer类来实现,是DRF的核心功能。
参考 Django restframework 序列化之 ModelSerializer 小记、Serializers 序列化组件——ModelSerializer详解 - 休耕,记录重要内容,详情见原文。
反序列化验证:在反序列化时,对数据验证,验证成功后才可获取数据或保存为模型类对象
①调用is_valid方法验证,成功True,失败False。
②验证失败时,通过序列化器对象的errors属性获取错误信息,返回字典包含字段和字段错误,如果非字段错误,可修改配置中NON_FIELD_ERRORS_KEY来控制键名。
③验证成功时,通过序列化器对象的validated_date属性获取数据。
注意点:带参数raise_exception=True在反序列化时is_valid()方法在验证失败时抛出serializers.ValidationError,REST framework接收到此异常,会向前端返回HTTP 400 Bad Request响应。
模型类序列化器ModelSerializer可基于模型类自动生成一系列字段,会自动生成valiators和实现了默认的create和update方法。
①实现了create和update方法后,在反序列化时既可以序列化对象.save()返回数据对象实例并保存或更新到数据库。
②调用save时,如果有传instance实例,则调用update方法更新数据,否则调用create方法新建数据。
③调用save可传参,参数可从validated_data中获取
④如果没有传递所有required字段,会抛出验证异常,可通过使用partial=True实现部分字段更新。
验证码生成与使用
可以使用PIL模块生成图片验证码,但不建议使用这种实现方式。除此之外,还可以通过第三方应用Django Simple Captcha实现,验证码的生成过程由该应用自动执行,开发者只需考虑如何应用到Django项目中即可。pip install django-simple-captch
,配 置 属 性 INSTALLED_APPS 添 加 了 captcha 。
API 文档生成工具
Swagger 是一种用于描述 RESTful API 的规范。它提供了一种简单的方式来描述 API 的请求和响应参数、错误码、返回数据类型等信息,使得开发者可以更加方便地了解 API 的使用方式。
- drf-yasg 介绍
https://github.com/axnsan12/drf-yasg
drf-yasg 也是一个基于 DRF 的 API 文档生成工具,同样支持 Swagger 2.0规范,并提供了自动生成文档和交互式文档页面的功能。它的特点是支持动态生成 Swagger UI,支持多种主题,可以自定义 API 文档样式,同时也提供了一些有用的功能,比如支持在文档中隐藏指定字段、支持在文档中添加额外的参数等。 - drf-spectacular介绍
https://github.com/tfranzel/drf-spectacular
drf-spectacular 是一个基于 DRF 的 API 文档生成工具,支持 OpenAPI 3.0规范,并提供了自动生成文档和交互式文档页面的功能。它支持自定义的扩展和重载,可以满足不同项目的需求,同时还提供了一些有用的功能,比如支持通过代码自动注册 API 视图、支持自定义请求和响应验证器等。
实现可参考Django(74)drf-spectacular自动生成接口文档 - Silent丿丶黑羽。异步任务和定时任务
Django的分布式主要由Celery框架实现,这是Python开发的异步任务队列。它支持使用任务队列的方式在分布的机器、进程和线程上执行任务调度。Celery侧重于实时操作,每天处理数以百万计的任务。Celery本身不提供消息存储服务,它使用第三方数据库来传递任务,目前第三方数据库支持RabbitMQ、Redis和MongoDB等。定时任务是异步任务的一种特殊类型的任务。使用第三方应用Django Celery Results、Django CeleryBeat、Celery和Redis数据库实现Django的异步任务和定时任务开发。首先需要安装Redis数据库,在Windows中安装Redis数据库有两种方式:在官网下载压缩包安装或者在GitHub下载MSI安装程序。前者的数据库版本是最新的,但需要通过指令安装并设置相关的环境配置;后者是旧版本,安装方法是傻瓜式安装,启动安装程序后按照安装提示即可完成安装。
安装异步任务所需要的功能模块,各个功能模块的具体作用 (1)celery:安装Celery框架,实现异步任务和定时任务的调度控制。(2)redis:使Python与Redis数据库实现连接。(3)django-celery-results:基于Celery封装的异步任务功能。(4)django-celery-beat:基于Celery封装的定时任务功能。(5)eventlet:Python的协程并发库,这是Celery实现的异步并发运行模式之一。
通过eventlet模块运行Celery框架的,Celery框架有多种运行方式,可以自行在网上查阅相关资料。基于前后端分离与微服务架构的网站开发
在配置文件settings.py中简化Django的内置功能,将配置属性INSTALLED_APPS和MIDDLEWARE的部分功能去除,保留了Auth认证系统和会话Session功能,当Django运行的时候只会加载Auth认证系统和会话Session功能,这样能减少Django占用服务器的系统资源。除此之外,还需要注释配置属性TEMPLATES和STATIC_URL,因为API接口无须使用模板功能和静态资源。将新建的项目应用添加到配置属性INSTALLED_APPS中,并在配置属性DATABASES中设置数据库的连接方式。设置跨域访问
在 Django中设置跨域访问,可以通过第三方功能应用DjangoCors Headers实现。首先在配置属性INSTALLED_APPS中添加DjangoCors Headers,然后在配置属性MIDDLEWARE中添加中间件CorsMiddleware,最后设置DjangoCors Headers的功能配置。
简化后的配置信息如下:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354# Application definition# django设置跨域访问模块:pip install django-cors-headersINSTALLED_APPS = [# 'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions',# 'django.contrib.messages',# 'django.contrib.staticfiles','index','corsheaders']MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware',# 跨域访问'corsheaders.middleware.CorsMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware',# 'django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',]# CORS_ALLOW_CREDENTIALS 设置HTTP请求是否允许携带Cookies信息,默认值为False。CORS_ALLOW_CREDENTIALS = True# CORS_ORIGIN_ALLOW_ALL 默认值为False,只允许CORS_ORIGIN_WHITELIST设置的域名列表发送HTTP请求;若为True,则允许所有域名发送HTTP请求。CORS_ORIGIN_ALLOW_ALL = True# CORS_ORIGIN_WHITELIST默认值为空列表,设置允许发送HTTP请求的域名,即部署前端服务器IP地址或域名。CORS_ORIGIN_WHITELIST = ()# CORS_ALLOW_METHODS 设 置 HTTP 的 请 求 方 式CORS_ALLOW_METHODS = ('DELETE','GET','OPTIONS','PATCH','POST','PUT','VIEW',)# CORS_ALLOW_HEADERS 设置非标准的HTTP请求头。CORS_ALLOW_HEADERS = ('XMLHttpRequest','X_FILENAME','accept-encoding','authorization','content-type','dnt','origin','user-agent','x-csrftoken','x-requested-with',)
微服务架构一共有6种设计模式,(1)聚合器微服务设计模式;(2)代理微服务设计模式;(3)链式微服务设计模式;(4)分支微服务设计模式;(5)数据共享微服务设计模式;(6)异步消息传递微服务设计模式。
对于微服务架构,架构的设计意识比技术开发更为重要,整个架构设计需要考虑多个微服务的运维难度、系统部署依赖、微服务之间的通信成本、数据一致性、系统集成测试和性能监控等。
微服务设计模式采用聚合器微服务设计模式,聚合器也称为API网关,这是统一管理和调度微服务的API接口,从而实现网页功能或应用程序开发。
JWT认证
如 果 使 用 Session 认 证 , 随 着 用 户 的 增 加 , 数 据 表django_session会产生大量的用户登录信息,使得服务器无法承载更多的用户。为了减轻服务器对用户认证的负担,可以改用JWT认证,它不需要在服务器保存用户认证信息或者会话信息。JWT由三部分数据构成,第一部分称为头部(header),第二部分称为载荷(payload),第三部分称为签证(signature)。
JWT认证常用于前后端分离的系统架构,如果使用Django REST framework框架编写API接口,可以使用pip install djangorestframework-simplejwt
。如果后台系统不是使用DRF框架开发,而是使用传统的路由-视图模式开发,JWT认证可以使用Python的第三方模块python_jwt实现。
参考用户认证:基于jwt和session的区别和优缺点、Django(65)jwt认证原理 - Silent丿丶黑羽、Django(75)django-rest-framework-simplejwt - Silent丿丶黑羽等文章。
jwt的缺点:
- 安全性
由于jwt的payload是使用base64编码的,并没有加密,因此jwt中不能存储敏感数据。而session的信息是存在服务端的,相对来说更安全。 - 性能
jwt太长。由于是无状态使用JWT,所有的数据都被放到JWT里,如果还要进行一些数据交换,那载荷会更大,经过编码之后导致jwt非常长,cookie的限制大小一般是4k,cookie很可能放不下,所以jwt一般放在local storage里面。并且用户在系统中的每一次http请求都会把jwt携带在Header里面,http请求的Header可能比Body还要大。而sessionId只是很短的一个字符串,因此使用jwt的http请求比使用session的开销大得多。 - 一次性
无状态是jwt的特点,但也导致了这个问题,jwt是一次性的。想修改里面的内容,就必须签发一个新的jwt。
(1)无法废弃
通过上面jwt的验证机制可以看出来,一旦签发一个jwt,在到期之前就会始终有效,无法中途废弃。例如你在payload中存储了一些信息,当信息需要更新时,则重新签发一个jwt,但是由于旧的jwt还没过期,拿着这个旧的jwt依旧可以登录,那登录后服务端从jwt中拿到的信息就是过时的。为了解决这个问题,我们就需要在服务端部署额外的逻辑,例如设置一个黑名单,一旦签发了新的jwt,那么旧的就加入黑名单(比如存到redis里面),避免被再次使用。
(2)续签
如果你使用jwt做会话管理,传统的cookie续签方案一般都是框架自带的,session有效期30分钟,30分钟内如果有访问,有效期被刷新至30分钟。一样的道理,要改变jwt的有效时间,就要签发新的jwt。最简单的一种方式是每次请求刷新jwt,即每个http请求都返回一个新的jwt。这个方法不仅暴力不优雅,而且每次请求都要做jwt的加密解密,会带来性能问题。另一种方法是在redis中单独为每个jwt设置过期时间,每次访问时刷新jwt的过期时间。
适合使用jwt的场景:有效期短,只希望被使用一次。微服务注册与发现
服务注册与发现主要由微服务注册与发现的中间件实现,常见中间件分别有Zookeeper、Ectd、Consul和Eureka。服务注册是将自身服务信息注册到中间件,这部分服务信息包括服务所在的主机IP和提供服务的端口,以及暴露服务自身状态和访问协议等信息。服务发现是从中间件获取服务实例的信息,通过这些信息发送HTTP请求并获取服务支持。微服务注册与发现应部署在API网关与各个微服务之间,不仅能负责各个微服务的管理,而且为API网关提供统一的API接口。
每次开启或关闭某个服务,我们必须使用微服务注册与发现,确保服务的开启或关闭不会影响系统运行,并且能灵活地为系统实现功能扩展。
CAP定理又称CAP原则,它是形容分布式系统的一致性(Consistency)、可用性(Availability)和分区容错性(Partitiontolerance),这三个要素最多只能同时实现两点,不可能三者兼顾。
总的来说,系统的微服务架构是将系统各个功能划分为一个个独立的服务,并且这些服务是部署在不同的服务器上的,微服务注册与发现是将分散在各处的服务进行汇总和管理。
- Consul
Consul是Google开源的一个服务发现、配置管理中心服务的中间件,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储和多数据中心方案等功能。它是使用Go语言开发,整个中间件以二进制文件运行,所以它都能在MacOS、Linux和Windows等系统上运行。
Consul的agent有两种运行模式:server和client,两者的差异说明如下:(1)client模式是客户端模式,这是Consul节点的一种模式,所有注册到当前节点的服务会被转发到server,数据不做持久化保存。(2)server模式的功能与client一样,两者唯一不同的是,server模式会把所有数据持久化,当遇到故障时,数据可以被保留。
Django中使用Consul实现微服务注册与发现:使用python-consul模块。
在实际开发中,Django应部署在uwsgi和Nginx服务器,应根据业务场景和开发需求设置合理的负载均衡策略,确保每个服务实例的负载数量在合理范围内。Django项目上线部署
目前 , 部 署 Django 项 目 有 两 种 主 流 方 案 :Nginx+uWSGI+Django或者Apache+uWSGI+Django。Nginx或Apache作为服务器最前端,负责接收浏览器所有的HTTP请求并统一管理。静态资源的HTTP请求由Nginx或Apache自己处理;非静态资源的HTTP请求则由Nginx或Apache传递给uWSGI服务器,然后传递给Django应用,最后由Django进行处理并做出响应,从而完成一次Web请求。
大多数开发者都是使用Windows操作系统进行项目开发的,而项目的部署以选择Linux操作系统为主。因此,我们在Windows上安装虚拟机VirtualBox(全称为Oracle VM VirtualBox)。可以在 https://www.virtualbox.org/wiki/Downloads 下载软件安装包或者在网上搜索相关资源下载安装。
在本地系统使用FileZilla(免费开源的FTP客户端软件)连接虚拟机CentOS 7系统,在FileZilla的站点管理输入虚拟机CentOS 7系统的IP地址、用户账号和密码即可实现连接。使用FileZilla软件实现本地系统与虚拟机系统间的FTP通信,这样方便两个系统之间的文件传输,利于项目的维护和更新。
uWSGI是一个Web服务器,它实现WSGI、uWSGI和HTTP等网络协议,而且Nginx的HttpUwsgiModule能与uWSGI服务器进行交互。WSGI是一种Web服务器网关接口,它是Web服务器(如Nginx服务器)与Web应用(如Django框架实现的应用)通信的一种规范。