1 Django 1.x
1.1 Django 模型
01.常用字段、关系型字段、字段参数、自关联、元数据
02.讲师信息表、课程信息表、学生信息表、助教信息表(一对一、多对一、多对多)
03.导入与导出

1.2 Django 视图
01.查询集
Teacher.objects.all():返回全部结果
Teacher.objects.get(nickname='Jack'):只能返回一条结果,多条则会报错
Teacher.objects.filter(fans__gte=500) :过滤
Teacher.objects.filter(fans__in=[666, 1231]):过滤
Teacher.objects.all()[:1]:切片
Teacher.objects.all().order_by('-fans'):降序排序
Teacher.objects.filter(fans__gte=500).order_by('nickname')) :链式查询
Teacher.objects.filter(fans__gte=500).order_by('nickname').query:查看原生SQL
02.返回新QuerySet的API
all():查询全部
filter():条件查询
order_by():升序查询
exclude():排除查询
reverse():降序查询
distinct():去重查询
extra():实现字段别名
defer():排除一些字段
only() :选择一些字段
values():获取字典形式的QuerySet
values_list():获取元组形式的QuerySet
dates(), datetimes():根据时间日期获取查询集
union():并集
intersection():交集
difference():差集
select_related():一对一、多对一查询优化(课程是子表,讲师是父表,子表 -> 查父表)
prefetch_related():一对多、多对多查询优化(学生是子表,课程是父表,子表 -> 查父表)
annotate() 使用聚合计数、求和、平均数、raw(),执行原生的SQL
反向查询:课程是子表,讲师是父表,父表 -> 查子表
03.不返回QuerySet的API
获取对象:get(), get_or_create(), first(), last(), latest(), earliest(), in_bulk()
创建对象:create(), bulk_create(), update_or_create()
更新对象:update(), update_or_create()
删除对象:delete()
判断是否存在,统计个数,聚合:exists(), count(), aggregate()
04.自定义实现聚合功能:实现GROUP_CONCAT功能
05.F对象(操作字段的数据)与Q对象(结合AND、OR、NOT、|、~、&实现复杂的查询)

2 Django REST Framework
2.1 DRF全局配置
01.项目配置
D:\software\Java\python\Lib\site-packages\django --环境变量
django-admin.py startproject 项目名 --创建Django项目
python manage.py startapp 应用名 --创建应用
python manage.py runserver 127.0.0.1:8000 --启动项目
02.配置数据库(sqlite3)
a.settings.py
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
'ENGINE': 'django.db.backends.mysql',
'NAME': 'drf',
'USER': 'root',
'PASSWORD': '4023615',
'HOST': 'localhost',
'PORT': '3307',
}
}
b.__init__.py
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()
c.命令
python manage.py makemigrations --迁移数据库
python manage.py migrate --同步数据库
python manage.py dumpdata > django_orm.json --导出数据
python manage.py loaddata django_orm.json --导入数据
03.配置admin
python manage.py createsuperuser --配置admin
用户名 (leave blank to use '13514'): admin --具体配置
电子邮件地址: [email protected]
Password:ZY950605
Password (again):ZY950605
Superuser created successfully.
04.其他
pip freeze > requirements.txt --生成requirement.txt
pip install -r requirements.txt --安装requirement.txt
05.报错一
a.报错
File "..\lib\sitepackages\django\db\backends\mysql\operations.py", line 146,
in last_executed_query query = query.decode(errors='replace')
AttributeError:'str' object has no attribute 'decode'
b.解决
点击异常信息的地址,将decode改为encode,query = query.encode(errors='replace')
06.报错二
a.报错
[WinError 123] 文件名、目录名或卷标语法不正确。: '<frozen importlib._bootstrap>'
b.解决
pip install bootstrap4
pip install django-bootstrap

2.2 DRF序列化

2.3 DRF视图和路由

2.4 DRF的认证和权限
2.4.1 信号机制自动生成Token

2.4.2 DRF权限控制

2.5 DRF的API接口文档

3 Django问答系统
3.1 环境搭建
00.项目环境准备
a.Windows10
PyCharm 2020.3.3
b.Centos7.6
python-3.7.2、django-2.1.7、cookiecutter-django-2.0.13、MySQL-8.0.20、Redis-3.2.1
01.Python-3.7.2、Pip3-19.0.2
a.安装依赖
yum -y install wget
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make
yum -y install python-devel mysql-devel mysql-lib bzip2-devel
b.下载Python安装包
cd /usr/local
wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz
tar -xvJf Python-3.7.2.tar.xz
cd /usr/local/Python-3.7.2
./configure --prefix=/usr/local/Python-3.7.2/ --enable-optimizations
make && make install
c.环境变量
echo 'export PATH=$PATH:/usr/local/Python-3.7.2/bin' >> /etc/profile && source /etc/profile
d.创建软链接
ln -s /usr/local/Python-3.7.2/bin/python3 /usr/bin/python3
ln -s /usr/local/Python-3.7.2/bin/pip3 /usr/bin/pip3
e.检查是否安装成功
python3 -V
pip3 -V
f.用update-alternatives来为整个系统更改Python版本
a.查看系统自带的Python、pip
whereis python
whereis pip
b.设置优先级
update-alternatives --install /usr/bin/python python /usr/bin/python2 1
update-alternatives --install /usr/bin/python python /usr/bin/python3 2
c.列出可用的Python替代版本
update-alternatives --list
d.选择可用的Python替代版本
update-alternatives --config python
e.测试
python --version --Python 3.7.2
python2 --version --Python 2.7.5
python3 --version --Python 3.7.2
g.更改默认python为python3后,无法使用yum命令,原因:yum依赖python2
a.修改第一处地方
vi /usr/bin/yum -> 将 #!/usr/bin/python 改为 #!/usr/bin/python2
b.修改第二处地方
vi /usr/libexec/urlgrabber-ext-down -> 将 #!/usr/bin/python 改为 #!/usr/bin/python2
02.cookiecutter-django-2.0.13模板,创建answer项目
a.安装Cookiecutter命令
pip3 install cookiecutter -i https://pypi.python.org/simple
b.使用cookiecutter-django-2.0.13模板来创建项目
cd /root/
cookiecutter https://github.com/pydanny/cookiecutter-django/archive/2.0.13.zip
---------------------------------------------------------------
You've downloaded C:\Users\mysla\.cookiecutters\cookiecutter-django before.
Is it okay to delete and re-download it? [yes]: no --不下载新版本
Do you want to re-use the existing version? [yes]: yes --仍然使用该本地版本
project_name [My Awesome Project]: answer --project_name
project_slug [answer]: answer --project_slug
description [Behold My Awesome Project!]: answer --description
author_name [Daniel Roy Greenfeld]: halavah --author_name
domain_name [example.com]: halavah.buzz --domain_name
email [[email protected]]: [email protected] --email
version [0.1.0]: --version
Select open_source_license:
1 - MIT
2 - BSD
3 - GPLv3
4 - Apache Software License 2.0
5 - Not open source
Choose from 1, 2, 3, 4, 5 [1]: 5 --Not open source
timezone [UTC]: Asia/Shanghai --timezone
windows [n]: n --windows
use_pycharm [n]: y --use_pycharm
use_docker [n]: n --use_docker
Select postgresql_version:
1 - 10.5
2 - 10.4
3 - 10.3
4 - 10.2
5 - 10.1
6 - 9.6
7 - 9.5
8 - 9.4
9 - 9.3
Choose from 1, 2, 3, 4, 5, 6, 7, 8, 9 [1]: 1 --postgresql_version
Select js_task_runner:
1 - None
2 - Gulp
Choose from 1, 2 [1]: --js_task_runner
custom_bootstrap_compilation [n]: --bootstrap_compilation
use_compressor [n]: y --use_compressor
use_celery [n]: y --use_celery
use_mailhog [n]: --use_mailhog
use_sentry [n]: --use_sentry
use_whitenoise [n]: --use_whitenoise
use_heroku [n]: --use_heroku
use_travisci [n]: --use_travisci
keep_local_envs_in_vcs [y]: n --keep_local_envs_in_vcs
debug [n]: y --debug
03.Pipenv虚拟环境
a.安装pipenv
python -m pip install --upgrade pip==21.0.1 && pip install pipenv -i https://pypi.python.org/simple
b.创建虚拟环境(python==3.7.2)
cd /root/answer && pipenv --python 3.7.2
Virtualenv location: /root/.local/share/virtualenvs/answer-tFUt2dYh/bin/python
c.创建项目环境
a.进入项目文件夹
[root@bigdata01 ~]# cd /root/answer
[root@bigdata01 workspace_pycharm]# ll
total 8
-rw-r--r--. 1 root root 192 Mar 18 19:39 Pipfile --替代原来的requirements.txt
-rw-r--r--. 1 root root 1082 Mar 18 19:34 Pipfile.lock --根据Pipfile生成的JSON格式依赖文件
b.修改镜像源,vi Pipfile
[[source]] --设置仓库地址
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
verify_ssl = true
name = "pypi"
[packages] --生产环境:项目依赖的包
django = "==2.1.7"
pytz = "==2018.9"
[dev-packages] --开发环境:项目依赖的包
[requires]
python_version = "3.7"
c.安装项目依赖(django==2.1.7、pytz==2018.9)
pipenv install django==2.1.7 pytz==2018.9 --生产环境:更新Pipfile.lock中hash值
pipenv install django==2.1.7 pytz==2018.9 --skip-lock --生产环境:跳过更新hash值
pipenv install django==2.1.7 pytz==2018.9 --skip-lock --dev --开发环境:跳过更新hash值
pip freeze > requirements.txt
pip install -r requirements.txt
pip unistall -r requirements.txt
pipenv install -r requirements/local.txt -i https://pypi.python.org/simple --skip-lock
pipenv install --安装Pipfile中[packages]的包
pipenv install --dev --安装Pipfile中[dev-packages]的包
pipenv install --system --使用系统的pip命令而不是虚拟环境命令
pipenv install --ignore-pipfile --忽略Pipfile直接安装Pipfile.lock
pipenv install --skip-lock --忽略Pipfile.lock直接安装Pipfile
pipenv uninstall --all --删除虚拟环境包,不改变Pipfile
pipenv uninstall --all-dev --删除虚拟环境包,并从Pipfile删除
d.启动项目(startapp -> DJANGO_APPS、THIRD_PARTY_APPS、LOCAL_APPS -> install、migrate、runserver)
pipenv run python manage.py makemigrations --针对某个字段进行迁移更新
pipenv run python manage.py migrate --针对某个字段进行重新生成
pipenv run python manage.py startapp news --生成应用
pipenv run python manage.py runserver 0.0.0.0:8000 --启动项目
pipenv run python manage.py createsuperuser --配置admin(halavah、QETU1234)
d.其他
a.管理虚拟环境
pipenv shell --进入虚拟环境
pipenv --rm --删除虚拟环境
exit --退出虚拟环境
python manage.py createsuperuser --进入pipenv创建管理
python manage.py runserver 192.168.2.128:8000 --进入pipenv启动项目
b.生成测试覆盖度报告
pipenv install coverage --skip-lock --安装测试工具
pipenv run coverage run manage.py test -v 2 --运行测试用例
pipenv run coverage html --生成测试报告
c.常见命令汇总
pipenv [OPTIONS] COMMAND [ARGS]
OPTIONS:
--where --显示项目文件所在路径
--venv --显示虚拟环境文件路径
--py --显示解释器的所在路径
--envs --显示虚拟环境的选项变量
--rm --删除当前使用的虚拟环境
--bare --最小化输出
--completion --完整输出
COMMAND:
check --检查安全漏洞
graph --显示当前依赖关系图信息
install --安全虚拟环境或第三方库
lock --锁定生成Pipfile.lock
open --在编辑器中查看一个库
run --在虚拟环境中运行命令
shell --进入虚拟环境
uninstall --卸载一个库
update --卸载当前包并安装最新版
04.Windows中PyCharm配置远程开发环境
a.创建新文件夹
mkdir D:\software_ware\workspace_pycharm\answer -> PyCharm打开answer新文件夹
b.Centos7远程项目
a.配置
a.打开配置
Tools -> Deployment -> Configuration -> + -> 类型SFTP -> 名称answer
b.Connection
SSH Configurations -> 192.168.2.128、root、4023615
Root Path:/root
Web server URL:http://192.168.2.128
Advanced:Send keep alive messages each -> 2 seconds
c.Mappings
Local path:D:\software_ware\workspace_pycharm\answer
Deployment path:/answer
Web path:http://192.168.2.128
d.Excluded Paths
无
b.选项
a.打开配置
Tools -> Deployment -> Options
b.修改配置
Exclude items by name:.svn;.cvs;.idea;.DS_Store;.git;.hg;*.hprof;*.pyc,【名称排除项】
Operations logging:Details,【操作记录】
Stop operation on the first error:不勾选,【在遇到第一个错误时停止操作】
Overwrite up-to-date files:勾选,【覆盖最新文件】
Preserve files timestamps:勾选,【保留文件时间戳】
Delete target items when source ones do not exist:勾选,【当源项不存在时删除目标项】
Create empty directories:勾选,【创建空目录】
Prompt when overwriting or deleting local items:勾选,【覆盖或删除本地项时提示】
Upload changed files automatically to the default server:勾选,【自动将更改的文件上传默认服务器】
Skip external changes:勾选,【跳过外部变更】
Delete remote files when local are deleted:勾选,【本地删除后删除远程文件】
Override default permissions on files:rwxrwxrwx(777),【重写文件的默认权限】
Override default permissions on folders:rwxrwxrwx(777),【重写文件夹的默认权限】
Warn when uploading over newer file:No,【在有更新的文件情况下进行上传时发出警告】
Show warning dialog on moving on Remote Host:勾选,【在远程主机上移动时显示警告对话框】
SFTP Advanced Options(IDE level setting):勾选,SFTP高级选项(IDE级别设置)
Add new host key to known_hosts:Always,将新主机键添加到known_hosts
Hash hosts in known_hosts file:勾选,known_hosts文件中的哈希主机
c.Python解释器
a.选择SSH解释器
Project: answer -> Python Interpreter -> Add Python Interpreter -> SSH Interpreter
SSH Configurations -> 192.168.2.128、root、4023615
b.移动本地IDE编辑器到服务器
Move
c.配置SSH解释器对应的服务器相关内容
Interpreter: /root/.local/share/virtualenvs/answer-tFUt2dYh/bin/python
Sync folders:D:/software_ware/workspace_pycharm/answer 对应 /root/answer
Automatically upload project files to the server
d.同步服务器代码、开启Django支持、项目启动配置
a.同步代码
answer -> Deployment -> Sync with Deployed to answer -> 手动Ctrl+S触发自动同步
b.开启Django支持
a.开启
Languages & Frameworks -> Enable Django Support
b.配置
Django project root:D:\software_ware\workspace_pycharm\answer
Settings:config\settings\local.py
Do not use Diango test runner:不勾选
Manage script:manage.py
Environment variables:无
Folder pattern to track files:无
c.项目启动配置
a.Host
Host:192.168.2.128:8000
Additional options:无
Run browser:勾选
Costom run command:不勾选
Test server:不勾选
No reload:不勾选
b.Environment:
Environment variables:PYTHONUNBUFFERED=1
Python interpreter:Interpreter: /root/.local/share/virtualenvs/answer-tFUt2dYh/bin/python
Interpreter options:无
Working directory:D:\software_ware\workspace_pycharm\answer
Path mappings:无
Add content roots to PYTHONPATH:勾选
Add source roots to PYTHONPATH:勾选
c.Logs
show console when a message is printed to standard output stream:勾选
show console when a message is printed to standard error stream:勾选
3.2 环境部署
01.部署项目
a.准备:关闭DEBUG模式,调整静态设置
vi /www/wwwroot/ProBlog/ProBlog/setting.py
DEBUG = False --关闭DEBUG模式
ALLOWED_HOSTS = ['*'] --允许所有人访问
STATIC_URL = '/static/'
# STATICFILES_DIRS = [ --STATICFILES_DIRS替换STATIC_ROOT
# os.path.join(BASE_DIR, 'static'),
# ]
STATIC_ROOT = os.path.join(BASE_DIR, "static") --STATICFILES_DIRS替换STATIC_ROOT
b.添加ProBlog项目
项目名称:ProBlog
路径:/www/wwwroot/ProBlog
Python版本:3.7.2
框架:django
启动方式:uwsgi
启动文件/文件夹:/www/wwwroot/ProBlog/ProBlog/wsgi.py
端口:8000
是否安装模块依赖:勾选
开机启动:勾选
c.修改ProBlog配置(/www/wwwroot/ProBlog/uswgi.ini)
[uwsgi]
# 配置和nginx连接的socket连接
socket = 127.0.0.1:8997
# 配置项目所在目录
chdir = /www/wwwroot/ProBlog/
# 配置wsgi接口模块文件路径,也就是wsgi.py这个文件所在的目录
wsgi-file = /www/wwwroot/ProBlog/ProBlog/wsgi.py
# 配置项目静态文件
static-map = /static=/www/wwwroot/ProBlog/static
# 配置存放主进程的进程号文件
pidfile = uwsgi.pid
# 配置dump日志记录
daemonize = uwsgi.log
# 配置启动管理主进程
master = True
# 配置启动的进程数
processes = 4
# 配置每个进程的线程数
threads = 2
# 最大数量的请求
max-requests = 1000
d.查看ProBlog虚拟环境,修复静态文件丢失(/www/wwwroot/ProBlog/ProBlog_venv)
a.进入虚拟环境
source /www/wwwroot/ProBlog/ProBlog_venv/bin/activate
b.依赖模块
python -m pip install --upgrade pip==21.0.1 --更新pip工具
pip freeze > requirements.txt --导出requirements.txt
pip install -r requirements.txt --安装requirements.txt
pip unistall -r requirements.txt --卸载requirements.txt
c.迁移数据库
python manage.py makemigrations --迁移数据库
python manage.py migrate --同步数据库
python manage.py dumpdata > django_orm.json --导出数据
python manage.py loaddata django_orm.json --导入数据
d.创建管理员、启动项目
python manage.py createsuperuser --进入pipenv创建超级管理员
python manage.py runserver 192.168.2.128:8000 --进入pipenv启动项目
e.修复静态文件丢失
python manage.py collectstatic --收集静态文件
02.部署网站
a.添加站点
域名:www.django.cn
备注:无
根目录:/www/wwwroot/ProBlog/
FTP:不创建
数据库:不创建
PHP版本:PHP-56
网站分类:默认分类
b.配置文件:新建访问规则
server
{
listen 80;
server_name www.diango.cn;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/ProBlog;
--------------------------------------------------------------------------
location / {
include uwsgi_params;
# 启动端口:同uwsgi.ini的socket连接端口
uwsgi_pass 127.0.0.1:8997;
# 启动文件:wsgi.py所在目录名+.wsgi
uwsgi_param UWSGI_SCRIPT ProBlog.wsgi;
# 项目路径:ProBlog
uwsgi_param UWSGI_CHDIR /www/wwwroot/ProBlog/;
}
location /static/ {
# 资源路径:static
alias /www/wwwroot/ProBlog/static/;
}
--------------------------------------------------------------------------
#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
#SSL-END
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END
#PHP-INFO-START PHP引用配置,可以注释或修改
include enable-php-56.conf;
#PHP-INFO-END
#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/www.diango.cn.conf;
#REWRITE-END
#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log off;
}
location ~ .*\.(js|css)?$
{
expires 12h;
error_log /dev/null;
access_log off;
}
access_log /www/wwwlogs/www.diango.cn.log;
error_log /www/wwwlogs/www.diango.cn.error.log;
}
c.反向代理:部署静态文件
location /static/ {
# 资源路径:static
root /www/wwwroot/ProBlog/static/;
break;
}
location /media/ {
# 资源路径:media
alias /www/wwwroot/ProBlog/media/;
}
03.运行项目
a.检查
是否收集静态文件至static
DEBUG是否关闭
宝塔面板-安全里是否放行了8000端口
云服务器安全组里是否放行了8000端口
静态文件路径是否有错误,包括在html里的引入要以/static/x x x x开头的绝对路径
b.运行
cd /root/ProBlog && pipenv shell
python manage.py runserver 192.168.2.128:8000
http://192.168.2.128:8000 daiyi 123456
http://192.168.2.128:8000/admin daiyi daiyi123456
3.3 开发项目
01.快速开始
a.网址
http://192.168.2.128:8000/accounts/login/
http://192.168.2.128:8000/accounts/signup/
b.位置
/root/.local/share/virtualenvs/answer-tFUt2dYh/bin/python
/root/.local/share/virtualenvs/zanhu-qCBWC76o/bin/python
c.密码
zanhu zanhu aFrRZACBBiKJMYdc
answer answer kBeZGFXBEz244mAp
