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