1.首先给配置全局pip换源:
'''
0.换源理由:
采用国内源,加载模块的下载速度。配置了全局换源后,就不用担心每次下载都需要换源了,一次性更换更彻底。
当然你说你不用换,那你也不用看。直接用国外的源也是可以的。只是国外的下载速度相对来说慢一些。
但是你又不想下国外的源,又想不换全局的。那你每次下载模块你就这样来(以下是两种都行):
pip3 install -i https://pypi.douban.com/simple 模块名
pip3 install -i https://mirrors.aliyun.com/pypi/simple 模块名
换源彻底的从这里开始:
1.在用户的根目录下创建一个 .pip 隐藏文件夹
终端执行:mkdir ~/.pip
2.在隐藏文件夹里创建 pip.conf 配置文件
终端执行:
切换到 .pip 文件夹下:
执行:cd .pip
再执行:touch pip.conf
3.在 .pip 文件夹下打开 pip.conf 配置文件
终端执行:
切换到 .pip 文件下,执行 open pip.conf
4.执行 open pip.conf 后,在配置文件里添加换源内容:
有以下两种源,随你选择:
-- 豆瓣:https://pypi.douban.com/simple:
以下才是内容:
[global]
index-url = https://pypi.douban.com/simple
[install]
use-mirrors = true
mirrors = https://pypi.douban.com/simple/
trusted-host = pypi.douban.com
-- 阿里:https://mirrors.aliyun.com/pypi/simple
以下才是内容:
[global]
index-url = https://mirrors.aliyun.com/pypi/simple
[install]
use-mirrors = true
mirrors = http:https://mirrors.aliyun.com/pypi/simple/
trusted-host = mirrors.aliyun.com
当你再去执行下载模块的时候,已经变得很快了。
'''
2.搭建虚拟环境(基于python3)
'''
搭建虚拟环境的好处:
1.使不同应用开发环境相互独立
2.环境升级不影响其他应用,也不会影响全局的python环境
3.防止出现包管理混乱及包版本冲突
让我们开始搭建吧:
1.在终端执行(如果没换源的请走第一个模块的内容)也就是安装虚拟环境:
-- pip3 install virtualenv
-- pip3 install virtualenvwrapper
2.配置(以下都是在终端执行的):
-- open ~/.zshrc
配置环境变量(不需要改变以有的环境,在原基础上添加即可):
-- export WORKON_HOME='/Users/cody/管理虚拟环境名'
-- export VIRTUALENVWRAPPER_PYTHON='/Library/Frameworks/Python.framework/Versions/3.6/bin/python3'
-- source /Library/Frameworks/Python.framework/Versions/3.6/bin/virtualenvwrapper.sh
保存内容后执行:
-- source ~/.zshrc
3.创建环境
你可以在根目录下创建一个管理所有虚拟环境的文件夹:
终端执行:
-- mkidr 文件夹名
-- cd 文件夹名
-- virtualenv 虚拟环境名 注:(这样创建的虚拟环境是系统默认的python2)
-- mkvirtualenv -p python3 虚拟环境名 注:指定python3创建虚拟环境
-- virtualenv -p python3 虚拟环境名 注:这样也行
4.进入环境,并使用
查看所有虚拟环境 -- workon
进入虚拟环境 -- workon 虚拟环境名
下载模块(8.x) -- pip3 install django
退出环境 -- deactivate
删除环境 -- rmvirtualenv 虚拟环境名
'''
3.Django项目的创建以及配置
环境创建
'''
都是在终端上执行
1.创建项目的虚拟环境
-- virtualenv -p python3 dgtest
2.在虚拟环境下安装所需依赖
-- pip3 install django
-- pip3 install djangorestframework
-- pip3 install pymysql
'''
项目创建
'''
终端上执行
1.为项目创建新的文件夹
-- mkidr test
2.创建Django项目
-- cd test
-- django-admin startproject testapi
3.用pycharm打开项目,并选择创建好的虚拟环境
'''
重构项目目录
'''
├─testapi #根目录
├── logs #项目运行时/开发时日志目录 - 文件夹
├── testapi #项目主应用,开发时的代码保存 - 包
| ├── apps # 开发者的代码保存目录,以模块[子应用]为目录保存 - 包
| ├── libs # 第三方类库的保存目录[第三方组件、模块] - 包
| ├── settins # 配置目录 - 包
| | ├── dev.py # 项目开发时的本地配置
| | ├── prod.py # 项目上线时的运行配置
| ├── utils # 多个模块[子应用]的公共函数类库[自己开发的组件] -包
| ├── __init__.py
| ├── urls.py # 总路由
| ├── wsgi.py
├── scripts # 保存项目运营时的脚本文件 - 文件夹
├── manage.py # 脚本文件
'''
配置开发环境
'''
1.将原有的 statings 文件夹里的内容剪切到新的 dev.py 文件里
2.修改 wsgi.py 与 manage.py 两个文件中的下面的内容
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'testapi.settings')
修改为:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'testapi.settings.dev')
3.将Django的环境语言配置成中文版(随便你选择,若不配也行),在 dev.py 里:
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False
4.修改Django的启动配置:
DJANGO_SETIONS_MODUD=testapi.settings
修改为:
DJANGO_SETIONS_MODUD=testapi.settings.dev
5.在任意__init__.py 文件下测试配置是否为 dev.py
from django.conf import settings
print(settings)
'''
配置日志(dev.py)
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': {
'level': 'DEBUG',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'file': {
# 实际开发建议使用WARNING
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
# 日志位置,日志文件名,日志保存目录必须手动创建,注:这里的文件路径要注意BASE_DIR代表的是小luffyapi
'filename': os.path.join(os.path.dirname(BASE_DIR), "logs", "test.log"),
# 日志文件的最大值,这里我们设置300M
'maxBytes': 300 * 1024 * 1024,
# 日志文件的数量,设置最大日志数量为10
'backupCount': 10,
# 日志格式:详细格式
'formatter': 'verbose',
# 文件内容编码
'encoding': 'utf-8'
},
},
# 日志对象
'loggers': {
'django': {
'handlers': ['console', 'file'],
'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统
},
}
}
封装logger(utils/logging.py)
import logging
logger = logging.getLogger('django')
环境变量配置
import sys
sys.path.insert(0, BASE_DIR)
APPS_DIR = os.path.join(BASE_DIR, 'apps')
sys.path.insert(1, APPS_DIR)
封装项目异常处理(utils/exception.py)
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.views import Response
from rest_framework import status
from utils.logging import logger
def exception_handler(exc, context):
response = drf_exception_handler(exc, context)
if response is None:
logger.error('%s - %s - %s' % (context['view'], context['request'].method, exc))
return Response({
'detail': '服务器错误'
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR, exception=True)
return response
二次封装response模块(utils/response.py)
from rest_framework.response import Response
class APIResponse(Response):
def __init__(self, data_status=0, data_msg='ok', results=None, http_status=None, headers=None, exception=False, **kwargs):
data = {
'status': data_status,
'msg': data_msg,
}
if results is not None:
data['results'] = results
data.update(kwargs)
super().__init__(data=data, status=http_status, headers=headers, exception=exception)
在testapi/apps/下创建user模块
'''
在pycharm里的终端输入:
-- cd testapi/apps
-- python ../../manage.py startapp user
'''
4.数据库配置(基于mysql 8.x版本)
'''
一.在终端进入mysql后
第一步:
create user '用户名'@'%' identified by '用户密码'
create user 'test'@'localhost' identified by '123456'
第二步:
grant all privileges on 数据库名.* to '用户名'@'%' with grant option
grant all privileges on test.* to 'test'@'localhost' with grant option
第三步:
刷新
flush privileges
第四步检验是否成功:
退出当前帐号,用新帐号登陆,再查看所有库即可。此时用户指定库搞定
二.配置Django连接mysql (dev.py)
1.DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #指定Django连接mysql
'NAME': 'test', #库名
'USER':'test', #用户名
'PASSWORD':'123456', #密码
'HOST': '127.0.0.1', #本地地址
'PORT': 3306, #端口号
}
}
2.testpai/__init__.py
import pymysql
pymysql.install_as_MySQLdb()
i.此时由于版本问题 可能会报这个错误:“RuntimeError: cryptography is required for sha256_password or caching_sha2_password”
那么,请不要慌张,请下载以下插件:
pip install cryptography
ii.如果还有这个错误:“mysqlclient 1.3.13 or newer is requitrd:you have 0.9.3”
进去line 36 那个源码,将
if version < (1,3,13) 等源码注释
iii.如果是这个错误:"'str' object has on attribute 'decode'"
进去line 146 加上
query = query.encode()
以上是这个版本可能报的错误,
三.mysql数据库一些常规指令
删除用户
delete from mysql.user where user='luffy' and host='%'
查看用户
select user,host from mysql.user
查看密码加密规则
select plugin,authentication_string from mysql.user
修改加密规则(我测试了,修改不了加密规则,还是老老实实下载那个插件靠谱,别在这浪费时间了)
alter user '用户名'@'localhost' identified by 'password' password expire never
更新用户密码
alter user '用户名'@'localhost' identified with mysql_native_password by 'password'
重制密码
alter user '用户名'@'localhost' identified by '用户密码'
'''
5.创建user表对应的model(user/models.py)
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
phone = models.CharField(max_length=11, unique=True)
icon = models.ImageField(upload_to='icon', default='icon/default.png')
class Meta:
db_table = 'test_user'
verbose_name = '用户表'
verbose_name_plural = verbose_name
def __str__(self):
return self.username
配置user表(dev.py)
INSTALLED_APPS = [
# ...
'user',
]
# 自定义User表
AUTH_USER_MODEL = 'user.User'
配置media(dev.py)
'在testapi 下创建文件夹 media,给用户暴露出去的接口'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
'media 目录配置'
'''
├── testapi
└── testapi
└── media/
└── icon
└── default.png
'''
主路由配置:testate/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
urlpatterns = [
path('admin/', admin.site.urls),
path('user/', include('user.urls')),
re_path('^media/(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT})
]
子路由配置:user/urls.py
from django.urls import path, re_path
urlpatterns = [
]
数据库迁移命令(在根目录下)
python3 manage.py makemigrations
python3 manage.py migrate
'将user表注册在admin里'
from django.contrib import admin
from user import models
admin.site.register(models.User)
'创建超级用户'
python3 manage.py createsuperuser