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