2022-05-03
devops
00
请注意,本文编写于 717 天前,最后修改于 717 天前,其中某些信息可能已经过时。

目录

wsgi与app通信

WSGI协议,决定了WSGI Server如何调用WSGI App. app是函数, wsgi协议调用 app(environ, start_response)。

1级server完成的事。2级是app被调用之后完成的事

  1. 接收数据

  2. 解析请求

  3. 调用app(environ, start_response)

    • 省略1万行

    • 响应头

    • 响应体

  4. 发响应

封装app的3种方法

可调用对象:函数,类,类的实例

返回可迭代对象

from wsgiref.simple_server import make_server server = make_server('127.0.0.1',8080,app) server.serve_forever()

函数

def app(environ, start_response): # .. start_response('200 OK',[('content-type', 'text/html;charset=utf-8')]) return [b'a', b'b'] server = make_server('127.0.0.1', 8080, app)

调用之后就实例,实例要是可迭代对象

class App(): def __init__(self,environ, start_response): self.environ = environ self.start_response = start_response def __iter__(self): # 返回迭代器 self.start_response('200 OK',[('content-type', 'text/html;charset=utf-8')]) yield from [b'a', b'b1'] server = make_server('127.0.0.1', 8080, App)

实例

类实例化之后,还可以调用

class App(): def __call__(self,environ, start_response): self.environ = environ self.start_response = start_response self.start_response('200 OK',[('content-type', 'text/html;charset=utf-8')]) return [b'a', b'b2']

environ中包含path, cookie, querystring, post data;

  • 路径,cookie, 查询字符,请求体

environ.get(key) => environ.key; Django, Flask把environ封装成request了,同时也省略了start_response, return可迭代对象。我们只关心生成内容。

Django

概念

就是app,一个大的函数,请求-> 调用app-> get_response进入, 很多中间件处理请求,进入视图(函数,类),响应后再经过中间件

  • 函数,返回响应

  • django类,as_view -> 实例化,分发 基于请求方法分发到类的属性,再返回响应

  • restframework 类,

    • APIView as_view -> 实例化,加强请求(request.data), 加强响应(序列化), apiexception, 权限,认证。分发请求。基于请求方法分发到类的属性,再返回响应

    • GenericAPIView 抽出属性,列表和详情通用的查询集和序列化器。不包含数据

    • mixin类, 提供通用的方法,与数据库交互。

    • ViewSet 整合列表和详情

    • ModelViewSet, 整合 genericapiview mixin viewset, as_view -> 实例化,加强请求,响应,异常,权限,认证,限流,基于映射action分发请求方法到不同视图。

    • router, 自动映射 列表 get -> list, post -> create; 详情 get -> retrieve, put -> update , patch -> partial_update , delete -> destroy;

优点

  1. 将模型,视图,控制器分开。MTV(mvc设计模式)
  2. 自带orm, template, form, auth核心组件,和组装的后台管理
  3. url设计
  4. 第3插件,DRF

缺点

3.0之前, 同步阻塞。3.0之后异步框架。

简要步骤

  1. 环境 django 3 -> 3.6-3.9; django 4 -> 3.10+
  2. 项目django-admin startproject salary ./
  3. 准备数据库 pip install mysqlclient, 配置mysql pip install --only-binary :all: mysqlclient
  4. 应用app python manage.py startapp employee, 注册应用
  5. 本地化,时区, 日志配置
  6. 数据库配置
  7. 创建django表 python manage.py makemigrations, python manage.py migrate

虚拟环境

  • python 3.8

  • pycharm 2021.2.3之后的版本

    • view -> app --> toolbar

安装django

版本python版本
1.11LTS2.7-3.7
2.2LTS
3.2LTS3.6-3.9
4.2LTS3.10

django3兼容2

bash
pip install django==3.2 # sqlparse, typing-extensions, asgiref, pytz, django
(djangoT39) C:\Users\rwx\PycharmProjects\djangoT39>pip list Package Version ---------- ------- asgiref 3.5.0 Django 3.2 pip 19.0.3 pytz 2022.1 setuptools 40.8.0 sqlparse 0.4.2

安装的库

lib标准库 site-packages 虚拟环境的包; - django/bin/django-admin

django脚手架

盖楼的工具django-admin

bash
# 项目脚手架 django-admin startproject salary ./ # 生成结构 salary包 init 包文件 asgi 异步 wsgi 符合wsgi协议的app url 路径映射 需要修改 settings 配置 需要修改 当前项目管理工具 manage.py
  1. ./ 当前目录创建项目,不需要salary/salary
  2. 每个项目独立,不要一个大项目,套小项目。每个虚拟环境不一样,这样做之后,所有项目的虚拟环境只能设置一个,所以只这样使用。

debug模式

settings中,debug仅开发使用

数据库

postgresql, mysql, sqlite3, oracle

# https://docs.djangoproject.com/en/3.2/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 't39', 'USER': 'wayne', 'PASSWORD': 'wayne', 'HOST': '127.0.0.1', 'PORT': '3306', } }
  • 准备t39库, utf8mb4。目前无1张 表。django会建立大量的表。
  • 不需要配置pymysql, 由ENGINE管理

django 3.2. 默认model类自增id类型, 默认大整型。

python
# Default primary key field type # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

准备应用

不同主题不同的代码, 游戏,音乐主题。现在使用项目内的管理工具

bash
(venv) C:\Users\21923\pycharm_projects\djangot39>python manage.py django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module. Did you install mysqlclient? # pymysql, python重写。mysqlclient扩展,使用C写的。 (venv) C:\Users\21923\pycharm_projects\djangot39>pip install mysqlclient Successfully installed mysqlclient-2.1.0

现在正常,说明数据库正常

bash
(venv) C:\Users\21923\pycharm_projects\djangot39>python manage.py Type 'manage.py help <subcommand>' for help on a specific subcommand. Available subcommands: [auth] changepassword # 修改密码 createsuperuser # 超级管理员 [contenttypes] remove_stale_contenttypes [django] check compilemessages createcachetable dbshell diffsettings dumpdata flush inspectdb loaddata makemessages makemigrations # 制作迁移文件 migrate # 迁移 sendtestemail shell showmigrations sqlflush sqlmigrate sqlsequencereset squashmigrations startapp # 创建业务应用,游戏/音乐/ startproject # 现在创建项目也可以使用 test testserver [sessions] clearsessions [staticfiles] collectstatic findstatic runserver # 启动服务
  1. runserver, django不是server, django为了开发方便, 内置server. 生产使用uwsgi/gunicorn这些WSGI Server。

创建应用

创建员工业务employee, 脚手架生成模板应用

(venv) C:\Users\21923\pycharm_projects\djangot39>python manage.py startapp employee

image-20220405095343749

应用加入项目管理

settings 中注册应用, 才可以生成数据库配置,url映射, 后台管理

diff
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'employee', ]
  1. 模块名小写
  2. 类才大写

本地化

settings 中, 汉化, 内建的页面默认英文,现在修改成中文

diff
# Internationalization # https://docs.djangoproject.com/en/3.2/topics/i18n/ +#LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = 'zh-Hans'

时区

settings 中, 默认是格林威治时间, 等价0时区。

diff
+# TIME_ZONE = 'UTC' +TIME_ZONE = 'Asia/Shanghai'

日志

Common Web application tools -> logging

抄代码, settings 中 最后一行

diff
import os LOGGING = { 'version': 1, 'disable_existing_loggers': False, + 'handlers': { # 可以添加写文件 + 'console': { # 控制台 'class': 'logging.StreamHandler', }, }, 'root': { # root默认WARNING + 'handlers': ['console'], # 控制台 'level': 'WARNING', }, 'loggers': { + 'django.db.backends': { # 关心django + 'handlers': ['console'], # console表示Stream + 'level': 'DEBUG', # sql语句 + 'propagate': False, # 是否向父级传播。自己有handdler, 不向root传播。我自己是django. }, }, }
  1. console 表示 stream
  2. root 是rootlogger
  3. loggers中,默认django, 但是有级别。有django.request, django, django.db.backend.
  4. 需要看SQL, 需要DEBUG=True, 同时django.db.backends 是DEBUG

启动

python
(venv) C:\Users\21923\pycharm_projects\djangot39>python manage.py runserver Watching for file changes with StatReloader Performing system checks... Waiting for apps ready_event. Apps ready_event triggered. Sending autoreload_started signal. Watching dir C:\Users\21923\pycharm_projects\djangot39\locale with glob **/*.mo. Watching dir C:\Users\21923\pycharm_projects\djangot39\employee\locale with glob **/*.mo. System check identified no issues (0 silenced). (0.000) SELECT VERSION(), @@sql_mode, @@default_storage_engine, @@sql_auto_is_null, @@lower_case_table_names, CONVERT_TZ('2001-01-01 01:00:00', 'UTC', 'UTC') IS NOT NULL ; args=None (0.000) SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; args=None (0.000) SHOW FULL TABLES; args=None You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. # 需要将认证,session迁移到数据库 Run 'python manage.py migrate' to apply them. # 运行迁移 April 05, 2022 - 10:17:42 Django version 3.2, using settings 'salary.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK.

image-20220405101851158

迁移django系统表

django代码 -> 迁移 -> db

  • 制作迁移文件

    • django内置表,默认就有迁移文件。
    • 自己写的model类,需要迁移。
    python manage.py makemigrations
  • 迁移,建表

    python manage.py migrate
bash
(venv) C:\Users\21923\pycharm_projects\djangot39>python manage.py makemigrations # 生成SQL语句 migrate # 建表

生成SQL语句

bash
(venv) C:\Users\21923\pycharm_projects\djangot39>python manage.py makemigrations (0.000) # 数据库语句 SELECT VERSION(), @@sql_mode, @@default_storage_engine, @@sql_auto_is_null, @@lower_case_table_names, CONVERT_TZ('2001-01-01 01:00:00', 'UTC', 'UTC') IS NOT NULL ; args=None (0.000) SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; args=None (0.000) SHOW FULL TABLES; args=None No changes detected # 无变化

应用SQL

bash
(venv) C:\Users\21923\pycharm_projects\djangot39>python manage.py migrate (0.016) INSERT INTO `django_migrations` (`app`, `name`, `applied`) VALUES ('auth', '0010_alter_group_name_max_length', '2022-04-05 02:23:23.468065'); args=['auth', '0010_alter_group_name_max_length', '2022-04-05 02:23:23.468065'] # 在migrate就是执行SQL脚本

image-20220628100947805

表名描述
django_migrations迁移记录表

本文作者:mykernel

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!