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
来源:https://www.cnblogs.com/cody-wu/p/11743770.html