1. 企业的web项目类型
1. 商城 (某某团购)
1.1 B2C直销商城 商家与会员直接交易(Busioness To Customer)
1.2 B2B批发商城 商家与商家直接交易
1.3 B2B2C购物平台 商家和会员在另一个商家提供的平台上进行交易
1.4 C2B定制商城 会员向商家发起定制商品的需求, 商家去完成
1.5 O2O线上线下交易平台
1.6 C2C二手交易平台
2. 门户网站[企业网站和门户网站]
3. 社交网络 (APP后端)
4. 咨询论坛 (技术, 买资料)
5. 内部系统 (办公管理, 人事管理, 客户关系管理)
6. 个人博客
7. 内容收费
2. 开发流程
2.1 项目来源
1. 公司需求
2. 客户定制
3. 互联网项目
2.2 流程
![0. 学城项目 后端环境配置_第1张图片](http://img.e-com-net.com/image/info8/5148010734c848e890ece596e84c770f.jpg)
* 1. 立项
需求分析(产品经理, 技术人员) --> 产品原型 --> 前/后端
* 2. 前端(根据原型图)
ui前端 --> ui切图 --> 前端实现
* 3. 后端
项目架构, 技术选型 --> 需求说明书, 原型图 --> 开发接口 --> 接口文档
* 4. 前后端代码整合
前后端联调 --> 继承测试(测试部, 质量控制部...)
* 5. 上线
工作流程: 公司项目管理平台(禅道...) --> 看自己的任务 --> 确定需求(询问测试, 询问发布任务的人员)
--> 写代码 --> 提交到git仓库 --> 管理平台将需求设置完成
2.3 开发模式
瀑布模式: 早期被广泛采用的软件开发模型 --> 开发完在测试 --> 出问题在调试
敏捷开发: 完成一个模块--> 测试 --> 上线 --> 下一个循环
scrum --> Sprint周期(小功能从开发到完成的时间) -->1 周
不做整体数据库的设计 --> 写到哪个模块,再去设计相关表
2.4 路飞项目需求
1. 首页轮播图
2. 登陆注册
多方式登陆,手机号登陆
手机号注册
3.课程列表
过滤,排序
4.课程详情
视频播放,课程介绍
5.下单/支付
支付宝支付
回调修改订单
3. pip换源
直接通过pip访问的是外网, 速度慢. 将pip的访问地址换成国内的地址, 加快下载模块的速度.
国内一些机构对Python官网的模块进行了备份.
国内五大源:
阿里云 http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣 http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
3.1 临时修改
临时修改: pip install xxx -i 地址
pip install pymysql -i http://pypi.douban.com/simple
![image-20220429234221769](http://img.e-com-net.com/image/info8/dea24f6292d14c6aa298f65e56d5910f.jpg)
3.2 永久修改
在计算机本地设置一个文件, 在下载模块的时候会依据这个文件的地址寻找模块进行下载.
* 1. 在路径栏中输入 %APPDATA% 到达 C:\Users\用户名\AppData\Roaming 的路径下
AppData文件夹: 是有关帐户信息, 系统桌面, 安装文件记录, 快速启动文件夹等内容的.
Roaming文件夹: 主要是用来存放一些程序运行后产生的数据文件.
![0. 学城项目 后端环境配置_第2张图片](http://img.e-com-net.com/image/info8/0fef745856894c7aa7fd98f0eef95b45.jpg)
* 2. 新建pip文件夹
![0. 学城项目 后端环境配置_第3张图片](http://img.e-com-net.com/image/info8/b3766f29f4bf44f9b2030a5aa96ce4c7.jpg)
* 3. 建立 pip.ini 配置文件
![0. 学城项目 后端环境配置_第4张图片](http://img.e-com-net.com/image/info8/5b9da21dbd27449dafa48df58c1bfe5c.jpg)
* 4. 在配置文件中输入以下配置信息, 并保存!
[global]
index-url = http://pypi.douban.com/simple
[install]
use-mirrors = true
mirrors = http://pypi.douban.com/simple/
trusted-host = pypi.douban.com
3.3 Pycharm换源
![0. 学城项目 后端环境配置_第5张图片](http://img.e-com-net.com/image/info8/a75f5d9674fe4cf591e8e842578818bc.jpg)
![0. 学城项目 后端环境配置_第6张图片](http://img.e-com-net.com/image/info8/3e73bb2ef7ef4519a77b632b7c7062b5.jpg)
4. 创建虚拟环境
同一个版本的Python建立的项目只能对应一个版本的模块.
例:
项目1, python3.6 使用 django1.x (运行项目2之后运行项目1, 需要卸载django2.x, 重装django1.x)
项目2, python3.6 使用 django2.x (运行项目1之后运行项目2, 需要卸载django1.x, 重装django2.x)
在开发多个软件的时候, 使用的模块版本不同则需要重新下载安装.
使用虚拟环境的好处:
不同的应用, 开发环境相互独立, 环境升级不影响其他应用, 也不会影响全局的Python环境.
防止出现包管理混乱及包版本冲突.
4.1 常用命令
1. 创建项目
命令: mkvirtualenv -p python3.8 虚拟环境名字
2. 查看创建的虚拟环境
命令: workon
3. 使用虚拟环境
workon 虚拟环境名字
4. 进入|退出 虚拟环境的Python环境
python | exit()
5. 为虚拟环境安装模块(已经进入到虚拟环境中)
pip install 模块名
6. 退出当前虚拟环境
deactivate
7. 删除虚拟环境 (删除当前虚拟环境要先退出, 也可以直接找到项目文件夹删除)
rmvirtualenv 虚拟环境名字
4.2 虚拟环境下创建项目
* 1. 安装依赖的模块
pip install virtualenv 虚拟环境模块: 创建虚拟环境麻烦 搭配↓
pip install virtualenvwrapper-win 虚拟环境辅助模块: 更快捷方便的操作和管理虚拟环境
* 2. 建立项目存放目录
在D盘下创建一个Virtualenvs文件夹
* 3. 配置环境变量
变量名 WORKON_HOME
变量值 D:\Virtualenvs
![0. 学城项目 后端环境配置_第7张图片](http://img.e-com-net.com/image/info8/1f4c73638cd24562a55a3be8ff87e661.jpg)
* 4. 指定virtualenvwrapper.bat脚本代码, 将配置信息同步
找到安装Python的目录, 打开Script目录 以管理员身份运行virtualenvwrapper.bat文件
执行一闪而过, 看不到什么信息的
![0. 学城项目 后端环境配置_第8张图片](http://img.e-com-net.com/image/info8/7c55979b0d144ce19c8f52e0293b0e51.jpg)
* 5. 在D:\Virtualenvs中使用命令提示符创建虚拟环境项目
命令: mkvirtualenv -p python3.8 虚拟环境名称
查看创建的虚拟环境
命令: workon
D:\Virtualenvs>mkvirtualenv -p python3.8 luffy
执行之后命令提示符中出现(项目名)
![0. 学城项目 后端环境配置_第9张图片](http://img.e-com-net.com/image/info8/df0c44b7be454560a3d21e9844a4d31b.jpg)
* 7. 查看虚拟环境的文件
![0. 学城项目 后端环境配置_第10张图片](http://img.e-com-net.com/image/info8/4b739665482b44f0ab81378925011112.jpg)
lib目录下放 安装的模块包.
Script目录下放 Python解释器, pip安装包管理工具.
* 8. 进入虚拟环境
命令: workon luffy
* 9. 安装Django(以后PyCharm中需要依赖虚拟环境直接创建Django项目, 就在虚拟环境中先安装好)
命令: pip install django==2.2.14
![0. 学城项目 后端环境配置_第11张图片](http://img.e-com-net.com/image/info8/ea5e0d35f0f64a0abe16a0e8d7c6440e.png)
4.3 Pycharm使用虚拟环境
* 1. 创建项目时选择虚拟环境中的python.exe
不需要创建模板 与 app
![0. 学城项目 后端环境配置_第12张图片](http://img.e-com-net.com/image/info8/a83f0ff6e75947bcb0ce7a0f54d969a0.jpg)
Note注意提示 Python下载的包会安装到选中的解释器中.
![0. 学城项目 后端环境配置_第13张图片](http://img.e-com-net.com/image/info8/1acefdbfdf284d63b2ca644d5e0ae318.jpg)
templates 目录可以不创建. 创建了后续删除即可, 使用的是Django2.2.14 需要修改templates的配置文件
TEMPLATES = [
{
'DIRS': [BASE_DIR, 'templates']
...
5. 重构项目目录
luffy 项目名
|--logs/ 项目运行事/开发时 的日志目录 -包
|--script/ 项目临时使用脚本文件目录
|--doc/ 存放项目介绍信息
|--readme.md 项目说明
|--luffy/ 项目主应用, 开发时代码存放的目录 -包
|--urls.py 总路由文件
|--wsgi.py Web服务器网关接口
|--utils/ 多个模块, 子应用的公共函数类库, 自己开发的组件
|--apps/ 开发者的代码存放的目录, 以子应用为目录 -包
|--libs/ 第三类/库存放目录, 第三方组件, 模块, 包
|--settings/ 配置目录
|--dve.py 项目来发是本地配置文件
|--prod.py 项目上线是运行的配置文件
|--requirement.txt 项目依赖的模块
* 1. 现在项目文件下新建
doc 文件夹 --> readme.md 项目介绍文件
logs 文件夹
scripr 包
![0. 学城项目 后端环境配置_第14张图片](http://img.e-com-net.com/image/info8/605d56473d714b1d910ddf0161b623dd.jpg)
* 2. 在项目名文件夹中创建
apps 文件夹
utils 文件夹
settings 文件夹
将项目名文件夹下的settings.py 复制两份 到settings文件夹中, 分别命令为dev.py 与 prod.py
原来settings.py 文件删除.
![0. 学城项目 后端环境配置_第15张图片](http://img.e-com-net.com/image/info8/203125ab26784619b813bcd787f07c43.jpg)
修改配置文件的位置之后, manage.py 控制台文件会找不到, 直接运行会报错!
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
* 3. 修改控制台文件manage.py
直接使用settings/dve.py的配置文件, 在配置中.文件名即可, 不需要后缀
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy.settings.dev')
![0. 学城项目 后端环境配置_第16张图片](http://img.e-com-net.com/image/info8/d716e91d232d4d0c97c57c6361d2d6f9.jpg)
* 4. 启动按钮重新配置(不修会出问题)
也会报错
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
修改为:
PYTHONUNBUFFERED=1; DJANGO_SETTINGS_MODULE=luffy.settings.dev
![0. 学城项目 后端环境配置_第17张图片](http://img.e-com-net.com/image/info8/bf416301fd3f4863936e18521b29cbbb.jpg)
* 5. 启动项目, 启动项目之后会生成sqlite3的数据库文件, 不需要可以删除!
![0. 学城项目 后端环境配置_第18张图片](http://img.e-com-net.com/image/info8/499936fb103c4413b44a7b23a8049451.jpg)
* 6. 上面配置文件需要在wsgi.py文件中配置(上线前就所有的配置信息使用的dev的, 上线的时候去复制一份
不用每次配置文件都修改两个文件)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy.settings.prod')
![0. 学城项目 后端环境配置_第19张图片](http://img.e-com-net.com/image/info8/24b92a0ae39b436eb9f333afd916c9a2.jpg)
* 7. 国际化设置(在两个配置文件中设置)
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
* 8. 创建app, 需要在apps包的路径下执行 python manage.py startapp app应用
该命令在哪里执行则会在那创建app. (下面的apps名字搞错了全部因该是home 写user习惯了)
1. 先切换路径到apps目录中
PS F:\synchro\Project\luffy> cd luffy/apps
2. 执行创建app命令
PS F:\synchro\Project\luffy\luffy\apps> python ../../manage.py startapp user
![0. 学城项目 后端环境配置_第20张图片](http://img.e-com-net.com/image/info8/9069d486b3e84249ac46e6dbdf00d1a1.jpg)
* 8. 配置文件中将 BASE_DIR 与 apps的路径添加到环境变量中
设置环境变量之后可以直接导入模块(在2.2.14使用的Path模块拼接路径)
import os
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, BASE_DIR)
sys.path.insert(1, os.path.join(BASE_DIR, 'apps'))
"""
BASE_DIR是配置文件的上一级上一个文件夹 项目名文件夹.
将项目名文件夹与 其子目录apps 添加到环境变量中.
"""
![0. 学城项目 后端环境配置_第21张图片](http://img.e-com-net.com/image/info8/82b9f5d0114a4f7ba088bbd650ec8b2a.jpg)
环境变量的使用场景
在导入文件的时候, 导入路径越短越好,
如果导入的路径中经过py文件会执行该文件, 路径过长可能会出问题(循环导入...)
在py文件中使用绝对路径与相对路径 .与.. 导入模块的后, 该文件只能直接运行, 只能够被其他的文件调用.
![0. 学城项目 后端环境配置_第22张图片](http://img.e-com-net.com/image/info8/369dcb48873d4fabae98c04c4ec2af33.jpg)
将 项目名文件夹 与 apps设置 Sources Root
![0. 学城项目 后端环境配置_第23张图片](http://img.e-com-net.com/image/info8/6e8ec6a59b34452db57d57bfb2b0d8d2.jpg)
之后则不会飘红了, 这个东西不能乱设置, 必须确保这个路径在环境变量中找到!
![0. 学城项目 后端环境配置_第24张图片](http://img.e-com-net.com/image/info8/83f1c0f8177345029af3cb359d3f9152.jpg)
* 9. 注册app, 配置文件与app文件都改变了, 但是将apps添加环境变量中后, 便能够直接注册app.
sys.path.insert(1, os.path.join(BASE_DIR, 'apps')) 设置的作用.
INSTALLED_APPS = [
...
'user',
]
6. 数据库配置
6.1 创建数据库
* 1. 在cmd中使用管理员连接数据库
命令: mysql -uroot -p123
C:\Users\13600>mysql -uroot -p123
* 2. 创建数据库
命令: create databse luffy default charset=utf8;
mysql> create database luffy default charset=utf8;
Query OK, 1 row affected (0.02 sec)
* 3. 查看创建的数据库
mysql> show databases;
+
| Database |
+
| information_schema |
| luffy |
| performance_schema |
+
3 rows in set (0.01 sec)
* 4. 查看用户信息
命令: select user, host, password from mysql.user;
5.7之后版本: select user, host, authentication_string from mysql.user;
mysql> select user, host, password from mysql.user;
+
| user | host | password |
+
| root | localhost | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| root | 127.0.0.1 | |
| root | ::1 | |
| | localhost | |
+
4 rows in set (0.00 sec)
6.2 为数据库指定用户
在打开项目的时候不直接使用root用户去连接数据库, 而是创建一个用户去操作数据表.
使用root用户登入之后, 新建一个用户, 并为用户设置权限, 密码
授权账户名: grant 权限(create, update...) on 库.表 to '账户'@'host' identified by '密码'
* 1. 配置任意ip都可以连接数据的账户
命令: grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
mysql> grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
Query OK, 0 rows affected (0.00 sec)
* 2. 由于数据库版本问题, 可能本地连接不上, 为本地用户单独配置
C:\Users\13600>mysql -uluffy -pLuffy123?
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'luffy'@'localhost' (using password: YES)
mysql> grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?';
Query OK, 0 rows affected (0.02 sec)
* 3. 重新加载权限
命令: flush privileges;
* 4. 查看用户信息
只能操作数据的账户 luffy 密码 Luffy123?
mysql> select user, host, password from mysql.user;
+
| user | host | password |
+
| root | localhost | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| root | 127.0.0.1 | |
| root | ::1 | |
| luffy | % | *A5576062BB7EC62806008F537658C42F0456DB9B |
| luffy | localhost | *A5576062BB7EC62806008F537658C42F0456DB9B |
+
5 rows in set (0.00 sec)
* 5. 登入
C:\Users\13600>mysql -uluffy -pLuffy123?
...
>mysql
* 6. PyCharm中下载pymysql
pip install pymysql
![image-20220430134426626](http://img.e-com-net.com/image/info8/83af9c94314a4426a39f15bd386729ef.jpg)
* 7. 配置文件中设置连接数据库的信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'luffy',
'USER': 'luffy',
'PASSWORD': 'Luffy123?',
'HOST': '127.0.0.1',
'POST': 3306
}
}
import pymysql
pymysql.install_as_MySQLdb()
* 8. Django 2.0.7 版本后可以出现一些问题, 需要修改源码
![0. 学城项目 后端环境配置_第25张图片](http://img.e-com-net.com/image/info8/23c05a74eb994cb094e094daaa589a63.jpg)
* 9. 如果提示 需要mysqlclient 1.3.13或更新版本, 去pymysql的源代码中 将版本提示代码注释掉
![0. 学城项目 后端环境配置_第26张图片](http://img.e-com-net.com/image/info8/f279c1ea2a664b34ab70a97a7b9cbd67.jpg)
7. 创建User表
用户表基于内置auth的user表.
注意: 在继承该表之前执行过数据库迁移命令, 后期想继承该表, 需要把所有app下的迁移文件删除, 之后删除库中表.
1. 删除 admin, auth, 自定义的app下的migrate文件的迁移文件, __init__.py 不能删除!
2. 删库使用Navicat Premium 将数据库的文件保存好, 再删除表文件重新执行数据库迁移命令!
* 7.1用于演示可以跳过到7.2
7.1 创建表之后继承用户
from django.contrib import admin
from django.contrib import auth
![0. 学城项目 后端环境配置_第27张图片](http://img.e-com-net.com/image/info8/fd5667c9810d4990bb941c00120cc1e5.jpg)
* 1. 创建用户表, 先不继承AbstractUser (测试)
from django.db import models
class User(models.Model):
phone = models.CharField(max_length=11, verbose_name='手机号码')
icon = models.ImageField(upload_to='icon', default='icon/default.png')
* 2. 配置文件中, 设置媒体文件路径
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
* 3. 在项目目录下创建media/icon目录, 添加一个默认头像, 文件名default.png
![0. 学城项目 后端环境配置_第28张图片](http://img.e-com-net.com/image/info8/a658a9421827470a8d4dda8d5b0f7479.jpg)
* 4. 开发媒体文件的访问
from django.contrib import admin
from django.urls import path, re_path
from django.views.static import serve
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls),
re_path('media/(?P.*)', serve, {'document_root': settings.MEDIA_ROOT})
]
* 5. 头像上传依赖Pillow模块
pip install Pillow
* 6. 执行数据库迁移命令
python manage.py makemigrations
python manage.py migrate
* 7. 在继承AbstractUser
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
phone = models.CharField(max_length=11, verbose_name='手机号码')
icon = models.ImageField(upload_to='icon', default='icon/default.png')
* 8. 配置使用自己定义的user表
AUTH_USER_MODEL = 'user.user'
* 9. 执行数据库迁移命令
PS F:\synchro\Project\luffy> python manage.py makemigrations
You are trying to add a non-nullable field 'password' to user without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
Select an option:
您正在尝试向用户添加一个不可为空的字段“password”,而没有默认值;我们不能这样做(数据库需要一些东西来填充现有的行)。
请选择修复程序:
1) 现在提供一个一次性默认值(将在所有现有行上设置此列的空值)
2) 退出,让我在模型中添加一个默认值
* 10. 删除数据库迁移文件
![0. 学城项目 后端环境配置_第29张图片](http://img.e-com-net.com/image/info8/c4ae6d1d91354e39bf4ad852e7fb56f5.jpg)
admin 与 auth 的数据库迁移文件第一次右击选择删除后, 文件还存在, 倒是右击没有了删除选项, 则代表删除成功!
![0. 学城项目 后端环境配置_第30张图片](http://img.e-com-net.com/image/info8/af40702c3e3e45a9bceb77d7dd90cc63.jpg)
![0. 学城项目 后端环境配置_第31张图片](http://img.e-com-net.com/image/info8/a474f9bfb2e94d22b33a3924c6b7510c.jpg)
* 11. 删除所有已经创建的表
使用Navicat Premium 连接数据库, 先点测试连接, 测试成功点击确定.
库名 luffy
用户 luffy
密码 Luffy123?
![0. 学城项目 后端环境配置_第32张图片](http://img.e-com-net.com/image/info8/583ed122f2864b779e703f8c53f3fa99.png)
一次无法全部删除, 剩下的表在全选中删除即可
![0. 学城项目 后端环境配置_第33张图片](http://img.e-com-net.com/image/info8/009c4d4489454ff49b1223582b444b04.jpg)
* 12. 执行数据库迁移命令
python manage.py makemigrations
python manage.py migrate
* 13. 启动项目, 测试媒体文件的访问
http://127.0.0.1:8000/media/icon/default.png
![0. 学城项目 后端环境配置_第34张图片](http://img.e-com-net.com/image/info8/2be0984151324746a068d1ff2277e228.jpg)
7.2 直接继承内置用户表
* 1. 继承内置用户表
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
phone = models.CharField(max_length=11, verbose_name='手机号码')
icon = models.ImageField(upload_to='icon', default='icon/default.png')
* 2. 在dev配置文件中配置使用自己定义的user表
AUTH_USER_MODEL = 'user.user'
* 3. dev配置文件中, 设置媒体文件路径
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
* 4. 在项目名目录下创建media/icon目录, 添加一个默认头像, 文件名default.png
![0. 学城项目 后端环境配置_第35张图片](http://img.e-com-net.com/image/info8/a988242a992b42669fddf7213e4172da.jpg)
* 5. 开放媒体文件的访问(admin没有创建, 将admin的代码注释掉)
from django.contrib import admin
from django.urls import path, re_path
from django.views.static import serve
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls),
re_path('^media/(?P.*)', serve, {'document_root': settings.MEDIA_ROOT})
]
* 6. 头像上传依赖Pillow模块
pip install Pillow
* 7. 执行数据库迁移命令
python manage.py makemigrations
python manage.py migrate
* 8. 启动项目, 测试媒体文件的访问
172.0.0.1:8000/media/icon/default.png
![0. 学城项目 后端环境配置_第36张图片](http://img.e-com-net.com/image/info8/a4f47094fcf6406cadfd1dab82379415.jpg)
8. xadmin管理后台
* 1. 创建超级用户用于登入后端管理
python manage.py createsuperuser
用户名: root
密码: zxc123456
![0. 学城项目 后端环境配置_第37张图片](http://img.e-com-net.com/image/info8/2d98de453ad94fb498a065ad35acaa9c.jpg)
* 2. 下载xadmin模块
pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2(下载最新的不要用)
去github找到适用于django2.x版本的xadmin
![0. 学城项目 后端环境配置_第38张图片](http://img.e-com-net.com/image/info8/f709f9ea6f914d02a7de894d59c3a714.jpg)
解压后里面有个xadmin就是我们需要的xadmin源码了, 将xadmin复制到apps中.(就是一个写好的app应用)
![0. 学城项目 后端环境配置_第39张图片](http://img.e-com-net.com/image/info8/7d69b1a697a74b809489371cdcecf3c6.jpg)
在解压后的目录中找到requirements.txt 这个文件中记录了xadmin需要使用的模块
django-crispy-forms>=1.6.0
django-import-export>=0.5.1
django-reversion>=2.0.0
django-formtools==2.1
future==0.15.2
httplib2==0.9.2
six==1.10.0
django==2.2.14 (修为当前使用的django版本, 不然Django会升级到最新的版本)
![0. 学城项目 后端环境配置_第40张图片](http://img.e-com-net.com/image/info8/ef072c4a87da48038cc752778c379601.jpg)
将这个文件复制到项目目录下, 点击右上角的提示 install plugins 则会将文件中的模样依次下载.
也可以手动一个个的 pip install xxx模块==版本 安装
* 3. 在dev.py配置文件的中注册app
'xadmin',
'crispy_forms',
'reversion',
* 4. 数据迁移
python manage.py makemigrations
python manage.py migrate
执行数据迁移的时候会报错.
1. 注释掉下面的命令
from import_export.admin import DEFAULT_FORMATS, SKIP_ADMIN_LOG, TMP_STORAGE_CLASS
2. 增加下面两条
from import_export.formats.base_formats import DEFAULT_FORMATS
from import_export.admin import ImportMixin, ImportExportMixinBase
![image-20220513185743673](http://img.e-com-net.com/image/info8/36f26440b3f442fc871018d3d1d9e5f0.jpg)
* 5. 在dev配置文件中将xadmin的路径添加到环境变量中
sys.path.insert(2, os.path.join(BASE_DIR, 'apps/xadmin'))
![0. 学城项目 后端环境配置_第41张图片](http://img.e-com-net.com/image/info8/b427c7867a4946b2a28423ae4e0d7eea.jpg)
执行之后再重新执行数据迁移命令
* 6. 修改主路由
将xadmin设置为Sources Root 不然会飘红
from django.contrib import admin
from django.urls import path, re_path, include
from django.views.static import serve
from django.conf import settings
import xadmin
xadmin.autodiscover()
from xadmin.plugins import xversion
xversion.register_models()
urlpatterns = [
re_path('^xadmin/', xadmin.site.urls),
re_path('^media/(?P.*)', serve, {'document_root': settings.MEDIA_ROOT}),
re_path('user', include('user.urls'))
]
* 7. 登入后台
![0. 学城项目 后端环境配置_第42张图片](http://img.e-com-net.com/image/info8/447c7175c5a947e28465941520ff261a.jpg)
* 8. 输入账户密码进入到后台
![0. 学城项目 后端环境配置_第43张图片](http://img.e-com-net.com/image/info8/3a0013c22fbf4576abe0aaee900e60a0.jpg)
* 9. user app目录下admin.py
import xadmin
from xadmin import views
class GlobalSettings(object):
"""xadmin的全局配置"""
site_title = "路飞学城"
site_footer = "路飞学城有限公司"
menu_style = "accordion"
xadmin.site.register(views.CommAdminView, GlobalSettings)
![0. 学城项目 后端环境配置_第44张图片](http://img.e-com-net.com/image/info8/c8db689d141346f4940f1d98e830596c.jpg)
8. 项目依赖库文件
软件开发目录规范中会有一个requirement.txt 文件, 该文件中存放项目依赖的模块.
pip list 查看所有的模块及版本号
pip freeze 查看所有的模块及版本号
8.1 导出模块信息
* 1. 查询模块及版本并追加到文件中, 在完成项目之后再执行即可.
pip freeze > requirement.txt
![0. 学城项目 后端环境配置_第45张图片](http://img.e-com-net.com/image/info8/fb42e6722bd04e8e89c2118475d2b4a5.jpg)
8.2 依据文件下载模块
在拿到一个项目的时候, 只有项目的代码, 项目的模块不没有的.
开发者将模块信息写入到requirement.txt文件中, 那么根据这个文件则可以通过
pip install -r requirement.txt -i 豆瓣源 下载安装模块
8.3 whl模块文件安装
某些模块通过 pip install 命令可能安装不了, 可以将模块文件下载到本地再安装.
(windows装的模块, 都是 xxx.whl文件)
模块下载网站: https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
![0. 学城项目 后端环境配置_第46张图片](http://img.e-com-net.com/image/info8/cd0b8fcd25914a7985cc28817101aefa.jpg)
选择一个模块下载练习安装 cp python的版本
![0. 学城项目 后端环境配置_第47张图片](http://img.e-com-net.com/image/info8/c005add37752478cb74a2e01bccc1585.jpg)
pip install 路径
![image-20220430231149901](http://img.e-com-net.com/image/info8/8b734df145cf4a8b960fc948c92c4aaa.jpg)
离线下载命令:
pip download -r 模块名 -d '路径'
pip download -r 模块名==1.1 -d '路径'
pip download -r requirement.txt -d '路径'
9. 全局异常配置&日志记录
9.1 自定义Response对象
统一异常信息的返回格式.
* 1. 安装rest_framework模块
pip install djangorestframework==3.10.3
![0. 学城项目 后端环境配置_第48张图片](http://img.e-com-net.com/image/info8/f221516322714d29bfff1142b8ec4e95.jpg)
* 2. 将rest_framework模块注册到app应用列表中
INSTALLED_APPS = [
...
'rest_framework'
]
* 3. 在utils.py文件下创建 api_response.py 响应模块
from rest_framework.response import Response
class ResponseDataFormat(Response):
def __init__(self, code=200, msg='访问成功!', data=None, status=None,
template_name=None, headers=None, content_type=None, **kwargs):
dic = {'code': code, 'msg': msg}
if data:
dic.update({'data': data})
dic.update(kwargs)
super().__init__(data=dic, status=status,
template_name=template_name, headers=headers, content_type=content_type)
9.2 定义异常返回格式
* 1. 定义全局异常信息返回格式
调用内置exception_handler异常处理模块处理三大认证的异常.
调用自定义Response对象ResponseDataFormat统一返回的数据格式.
from rest_framework.views import exception_handler
def exception_response(exc, context):
response = exception_handler(exc, context)
if response:
data = response.date.get('detail')
else:
data = str(exc)
return ResponseDataFormat(code=400, msg='访问失败', data=data)
* 2. 在dev.py配置文件中配置全局使用的异常处理模块
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'luffy.utils.api_response.exception_response'
}
9.3 日志配置
* 1. 在dev.py中添加日志模块的配置字典(Django官网提供的)
logs目录下会自动创建luffy.log 文件
# 字典, 日志的配置信息
LOGGING = {
# 版本
'version': 1,
# 禁用现有的记录器
'disable_existing_loggers': False,
# 日志的格式(定义两个不同的格式)
'formatters': {
# 详细的版本
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
},
# 简单的版本
'simple': {
'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
},
},
# 过滤日志
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
# 显示
'handlers': {
# 打印到终端的日志
'console': {
# 实际开发建议使用WARNING
'level': 'DEBUG', # 级别
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple' # 使用的格式
},
# 写入到文件
'file': {
# 实际开发建议使用ERROR
'level': 'ERROR', # 级别
'class': 'logging.handlers.RotatingFileHandler',
# 日志位置, 日志文件名, 日志保存目录必须手动创建, 注:BASE_DIR是项目名目录
'filename': os.path.join(os.path.dirname(BASE_DIR), "logs", "luffy.log"),
# 日志文件的最大值,这里我们设置300M
'maxBytes': 300 * 1024 * 1024,
# 日志文件的数量,设置最大日志数量为10
'backupCount': 10,
# 日志格式:详细格式
'formatter': 'verbose',
# 文件内容编码
'encoding': 'utf-8'
},
},
# 日志对象
'loggers': {
'django': {
# 将日志打印到终端 并 写入到文件
'handlers': ['console', 'file'],
'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统
},
}
}
* 2. 在utils.py 新建logger.py模块, 模块中生成日志对象, 方便以后的调用.
import logging
log = logging.getLogger('django')
* 3. 在异常响应中记录日志
from rest_framework.views import exception_handler
from .logger import log
def exception_response(exc, context):
response = exception_handler(exc, context)
if response:
data = response.date.get('detail')
else:
data = str(exc)
view = context["view"].__class__.__name__
log_format = (f'当前视图: {view}, 报错信息: {data}.')
log.error(log_format)
return ResponseDataFormat(code=400, msg='访问失败', data=data)
9.4 测试
写一个视图类对全局异常日志代码进行测试.
* 1. 在项目名目录下的urls.py总路由文件中设置路由分发
from django.contrib import admin
from django.urls import path, re_path, include
from django.views.static import serve
from django.conf import settings
import xadmin
urlpatterns = [
re_path('^xadmin/', xadmin.site.urls),
re_path('^media/(?P.*)', serve, {'document_root': settings.MEDIA_ROOT}),
re_path('user', include('user.urls'))
]
* 2. 在user目录下新建urls.py 子路由文件
from django.urls import re_path
from user import views
urlpatterns = [
re_path('exception_log/', views.ExceptionLog.as_view())
]
* 3. 在apps目录下的views.py 视图层中写测试的视图类
from rest_framework.views import APIView
from luffy.utils.api_response import ResponseDataFormat
class ExceptionLog(APIView):
def get(self, request):
return ResponseDataFormat(data='异常&日志测试!')
* 4. 启动程序正常访问 (三大认证与视图类中现在是没有任何错误的)
127.0.0.1:8000/user/exception_log/
# csnd你牛逼在前上面这个链接加了http, 就提示文章质量低!!!
![0. 学城项目 后端环境配置_第49张图片](http://img.e-com-net.com/image/info8/3943a96e8d504eff88af4e9f5bf90f4a.jpg)
* 5. 查看日志文件信息
![0. 学城项目 后端环境配置_第50张图片](http://img.e-com-net.com/image/info8/c248aad553c347ea9d10b1add01fb957.jpg)
* 6. 在视图类中手写bug. 测试视图类出现异常记录日志.
from rest_framework.views import APIView
from luffy.utils.api_response import ResponseDataFormat
class ExceptionLog(APIView):
def get(self, request):
print(xxx)
return ResponseDataFormat(data='异常&日志测试!')
* 7. 启动程序, 访问 http://127.0.0.1:8000/user/exception_log/
![0. 学城项目 后端环境配置_第51张图片](http://img.e-com-net.com/image/info8/9e624d7320994f62834b42db812c4d19.jpg)
* 8. 查看日志与窗口的日志信息
![0. 学城项目 后端环境配置_第52张图片](http://img.e-com-net.com/image/info8/302c22f35a4d43d1a00f00173a62f86a.jpg)
* 9. 测试成功, 将手写的bug删除!