WSGI协议,决定了WSGI Server如何调用WSGI App. app是函数, wsgi协议调用 app(environ, start_response)。
1级server完成的事。2级是app被调用之后完成的事
接收数据
解析请求
调用app(environ, start_response)
省略1万行
响应头
响应体
发响应
可调用对象:函数,类,类的实例
返回可迭代对象
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;
environ.get(key) => environ.key; Django, Flask把environ封装成request了,同时也省略了start_response, return可迭代对象。我们只关心生成内容。
就是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;
3.0之前, 同步阻塞。3.0之后异步框架。
django 3 -> 3.6-3.9; django 4 -> 3.10+
django-admin startproject salary ./
pip install mysqlclient
, 配置mysql pip install --only-binary :all: mysqlclient
python manage.py startapp employee
, 注册应用python manage.py makemigrations, python manage.py migrate
python 3.8
pycharm 2021.2.3之后的版本
版本 | python版本 |
---|---|
1.11LTS | 2.7-3.7 |
2.2LTS | |
3.2LTS | 3.6-3.9 |
4.2LTS | 3.10 |
django3兼容2
bashpip 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-admin
bash# 项目脚手架
django-admin startproject salary ./
# 生成结构
salary包
init 包文件
asgi 异步
wsgi 符合wsgi协议的app
url 路径映射 需要修改
settings 配置 需要修改
当前项目管理工具 manage.py
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', } }
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 # 启动服务
创建员工业务employee, 脚手架生成模板应用
(venv) C:\Users\21923\pycharm_projects\djangot39>python manage.py startapp employee
settings 中注册应用, 才可以生成数据库配置,url映射, 后台管理
diffINSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
+ 'employee',
]
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 中 最后一行
diffimport 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.
},
},
}
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.
django代码 -> 迁移 -> db
制作迁移文件
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脚本
表名 | 描述 |
---|---|
django_migrations | 迁移记录表 |
本文作者:mykernel
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!