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請求拿取數據了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章