DRF專案框架基礎設計
DRF之專案搭建
DRF,全稱Django Restful Framework,是一個基於Django的Restful介面框架,是主要用來作API介面的,為前端提供資料的介面。在前面一片部落格中,咱們構建了一個vue的專案,vue專案是一個前端專案,這個前端專案中的資料就是介面獲取的,而今天要完成的drf專案,就是為vue專案提供資料作介面的,咱們把前端vue專案和後端drf專案加在一塊兒,就能夠完成一個先後端分離的web專案。前端
1、搭建虛擬環境
在以前的全部程式碼或者說專案裡,都是使用的windows下全域性的一個python環境,好比說咱們作一個爬蟲專案,原本就只須要request的關於爬蟲的模組,但因為用的是全域性的python環境,這個環境下不止這些關於爬蟲的模組,還有不少其餘無關的模組。一是會讓這個專案很龐大,不少無關的模組存在,二是專案很差轉移,意思就是,我把專案共享出去,或者發給其餘人使用,他到底須要安裝些什麼模組就可讓專案跑起來,總不能讓別人把我全域性python下的全部模組都安裝上吧,那這就有點荒唐了;三是,就算你知道這個專案須要些啥模組,但你知作別人安裝模組的版本號???版本號不同,專案照樣執行不起來的。因此咱們要給每一個專案分配對應的虛擬環境,把當前專案所須要的模組及其版本進行隔離包裝到一個虛擬環境中既可。vue
1,安裝
pip install virtualenv pip install virtualenv-clone pip install virtualenvwrapper pip install virtualenvwrapper-win
#這些命令只適用於Windows系統
2,經常使用命令
建立虛擬環境: mkvirtualenv 虛擬環境名稱 建立虛擬環境(指定python版本): mkvirtualenv -p python 虛擬環境名稱 檢視全部虛擬環境: workon+2次tab鍵 使用虛擬環境: workon 虛擬環境名稱 退出虛擬環境: deactivate 刪除虛擬環境(必須先退出虛擬環境內部才能刪除當前虛擬環境): rmvirtualenv 虛擬環境名稱 其餘相關命令: 檢視虛擬環境中安裝的包: pip freeze 或者 pip list 收集當前環境中安裝的包及其版本: pip freeze > requirements.txt 在部署專案的伺服器中安裝專案使用的模組: pip install-r requirements.txt
虛擬環境只會管理環境內部的模組和python解析器,對於原始碼是毫無關係的python
3,建立虛擬環境
把安裝的四條命令輸入到cmd裡,就安裝好。而後再cmd中輸入mkvirtualenv lufei,這樣我就建立了一個叫lufei的虛擬環境。mysql
輸入:workon lufei,就進入到lufei的虛擬環境中。標誌是:虛擬環境名會在命令列的最左邊括號包起來ios
4,在lufei虛擬環境中安裝專案須要的模組
這是一個基於django的restful framework,使用的是mysql資料庫,因此首先咱們的安裝這四個模組web
pip install django
pip install PymySQL
pip install Pillow
pip install djangorestframework
切記哈,這四條命令要在lufei的虛擬環境中安裝,否則就安裝到全域性的python環境了,因此安裝的時候必定要確認最左邊有沒有虛擬環境的名字。ajax
5,新建的虛擬環境的位置
2、建立一個django專案
1,建立專案
上面已經說過了,虛擬環境跟原始碼是沒有關係的,因此咱們在任何地方建立Django專案均可以,最後在pycharm開啟django專案,而後把環境換成虛擬環境就好了。sql
好比說我想在'D:\資料'目錄下建立一個django專案,咱們用cmd切換目錄來到這個目錄下:shell
也能夠直接在'D:\資料'中,空白處,shift+滑鼠右鍵(win10的操做),選中powershell(這個是和cmd同樣的終端),也能夠直接到目標目錄下:資料庫
而後輸入命令:django-admin startproject lufei ,這樣就建立了一個名叫lufei的django專案
如今,咱們就能夠在資料夾中看到新建的這個django專案了:
2,配置虛擬環境
如今咱們用pycharm開啟這個專案,而後點選file,在選中settings:
點選右上角的圖示,選中add:
這樣就找到了咱們以前建立的那個叫lufei的虛擬環境了
這樣咱們就把當前專案的虛擬環境切換成功了。如今你看到安裝的模組只有虛擬環境中的模組,而不是全域性python下的全部模組。
3、專案配置
1,目錄調整
咱們應該把目錄調整成這樣的:
docs資料夾:專案相關資料儲存目錄
logs資料夾:專案執行或開發時的日誌目錄
lufei_drf資料夾:程式碼儲存目錄
apps資料夾:開發者的程式碼儲存目錄,主要是子應用程式碼儲存目錄
libs資料夾:第三方類庫的儲存目錄
utils資料夾:子應用的公共函式類庫
scripts資料夾:儲存專案運營時的指令碼檔案
2,配置資料庫
2.1 建立資料庫
在cmd連結上資料庫,以root身份進入,而後輸入:create database lufei default charset=utf8; 這樣就建立了一個名為lufei的資料庫
2.2 為當前lufei資料庫建立使用者,並且設定此使用者只能看到這個資料庫
create user lufei_user identified by 'lufei'; #建立一個名為lufei_user的使用者,密碼為lufei grant all privileges on lufei.* to 'lufei_user'@'%'; #為此使用者分配許可權,此使用者的許可權是lufei庫 flush privileges; #重新整理許可權
2.3 在專案的settings.py檔案中配置資料庫連結
DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", #表示連結的是mysql資料庫 "HOST": "127.0.0.1", "PORT": 3306, #mysql預設埠號3306 "USER": "lufei_user", #使用者名稱 "PASSWORD": "lufei", #密碼 "NAME": "lufei", #連結的是lufei庫 } }
2.4 在專案下的主模組的__init__.py配置
import pymysql pymysql.install_as_MySQLdb()
3,日誌配置
在settings.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': { 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', 'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/lufei.log"), 'maxBytes': 300 * 1024 * 1024, 'backupCount': 10, 'formatter': 'verbose' }, }, 'loggers': { 'django': { 'handlers': ['console', 'file'], 'propagate': True, }, } }
4,把rest_framework注入Apps中:
在settings.py檔案下的INSTALLED_APPS變數中加入
INSTALLED_APPS = [ 'rest_framework', ]
5,異常處理配置
在utils資料夾下新建一個exceptions.py檔案
from rest_framework.views import exception_handler from django.db import DatabaseError from rest_framework.response import Response from rest_framework import status import logging logger = logging.getLogger('lufei') def custom_exception_handler(exc, context): """ 自定義異常處理 :param exc: 異常類 :param context: 丟擲異常的上下文 :return: Response響應物件 """ # 呼叫drf框架原生的異常處理方法 response = exception_handler(exc, context) if response is None: view = context['view'] if isinstance(exc, DatabaseError): # 資料庫異常 logger.error('[%s] %s' % (view, exc)) response = Response({'message': '伺服器內部錯誤'}, status=status.HTTP_507_INSUFFICIENT_STORAGE) return response
在settings.py檔案下REST_FRAMEWORK變數中新增:
REST_FRAMEWORK = { # 異常處理 'EXCEPTION_HANDLER': 'lufei.utils.exceptions.custom_exception_handler', }
4、解決前端vue專案跨域問題
前端vue專案和後端drf專案是執行在不一樣伺服器上的,因此咱們在前端頁面中用axios傳送請求,會遇到同源策略的問題,致使vue前端專案拿不到資料,解決同源策略咱們能夠瞎用CORS,就是在後端設定能夠跨域請求的白名單,而後給這些白名單的響應里加入‘Access-Control-Allow-Origin’,這樣瀏覽器就能夠放行了,前端就拿到資料了。
在django裡面可使用外掛‘django-cors-headers’幫咱們解決跨域問題。
1,為前端和後端設定不一樣的域名
1.1 修改host檔案
Windows系統下位置:c:\windows\system32\driver\etc\host
咱們把後端域名改成:api.lufei.cn
前端域名改成:www.lufei.cn
因此咱們須要在host檔案中加入:
127.0.0.1 api.luffycity.cn
127.0.0.1 www.luffycity.cn
1.2 配置settings.py檔案
# 設定哪些客戶端能夠經過地址訪問到後端 ALLOWED_HOSTS = [ 'api.lufei.cn', 'www.lufei.cn', 'localhost', # 實際開發的時候不會寫上localhost和127.0.0.1的 '127.0.0.1', ]
2,解決跨域問題
2.1 安裝外掛
pip install django-cors-headers #記得是在虛擬環境下安裝
2.2 setting.py配置
首先在APPS裡面注入外掛
在變數INSTALLED_APPS新增
INSTALLED_APPS = ( 'corsheaders', )
其次是新增中介軟體
在MIDDLEWARE變數中新增,切記新增在列表的第一個
MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', ]
最後就能夠設定放行白名單了
# CORS組的配置資訊 CORS_ORIGIN_WHITELIST = ( '127.0.0.1:8080', 'localhost:8080', 'www.lufei.cn:8080' ) CORS_ALLOW_CREDENTIALS = True # 容許ajax跨域請求時攜帶cookie
這樣設定後,前端頁面就能夠放心的用axios請求拿取資料了
原文地址:https://www.cnblogs.com/12345huangchun/p/10583878.html