day75:luffy:路飛學城專案後端環境搭建&Git相關知識點

Poke發表於2020-10-26

目錄

1.Xadmin

  1.Xadmin介紹

  2.Xadmin安裝

  3.Xadmin的使用

2.專案環境搭建

  1.外部依賴

  2.依賴包安裝

  3.搭建專案

3.Git

4.日誌配置

5.異常處理

6.建立資料庫

1.Xadmin

1.Xadmin介紹

xadmin是Django的第三方擴充套件,比使用Django的admin站點更強大也更方便。

文件:https://xadmin.readthedocs.io/en/latest/index.html

GitHub地址:https://github.com/sshwsfc/django-xadmin

2.Xadmin安裝

1.通過如下命令安裝xadmin的最新版,它文件裡面的安裝方法好久沒有更新了,會導致你安裝不成功,所以我們使用下面的網址進行安裝

pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2

2.在配置檔案修改如下資訊

INSTALLED_APPS = [
    ...
    'xadmin',
    'crispy_forms',
    'reversion',
    ...
]

# 修改使用中文介面
LANGUAGE_CODE = 'zh-Hans'

# 修改時區
TIME_ZONE = 'Asia/Shanghai'

3.xadmin有建立自己的資料庫模型類,需要進行資料庫遷移

python manage.py makemigrations
python manage.py migrate

4.在總路由中新增xadmin的路由資訊

import xadmin
xadmin.autodiscover()

# version模組自動註冊需要版本控制的 Model
from xadmin.plugins import xversion
xversion.register_models()

urlpatterns = [
    path(r'xadmin/', xadmin.site.urls),
]

5.如果之前沒有建立超級使用者,需要建立,如果有了,則可以直接使用之前的。

python manage.py createsuperuser

3.Xadmin的使用

  • xadmin不再使用Django的admin.py,而是需要編寫程式碼在adminx.py檔案中,每一個應用都可以寫一建立adminx.py對xadmin站點進行配置。

  • xadmin的站點管理類不用繼承admin.ModelAdmin,而是直接繼承object即可。

例如:在子應用中建立adminx.py檔案。

站點的全域性配置

import xadmin
from xadmin import views

class BaseSetting(object):
    """xadmin的基本配置"""
    enable_themes = True  # 開啟主題切換功能
    use_bootswatch = True # 引導控制盤(其實就是我們的左側選單欄)

xadmin.site.register(views.BaseAdminView, BaseSetting)

class GlobalSettings(object):
    """xadmin的全域性配置"""
    site_title = "路飛學城"  # 設定站點標題
    site_footer = "路飛學城有限公司"  # 設定站點的頁尾
    menu_style = "accordion"  # 設定選單摺疊

xadmin.site.register(views.CommAdminView, GlobalSettings)

站點Model管理

xadmin可以使用的頁面樣式控制基本與Django原生的admin一樣

Xadmin自定製

可以在models類中定義個__str__方法來定義物件顯示成什麼內容

1.list_display 控制列表展示的欄位

list_display = ['id', 'btitle', 'bread', 'bcomment']

2.search_fields 控制可以通過搜尋框搜尋的欄位名稱,xadmin使用的是模糊查詢

search_fields = ['id','btitle']

3.list_filter 可以進行過濾操作的列,對於分類、性別、狀態

list_filter = ['is_delete']

4.ordering 預設排序的欄位

ordering = ['-age',]  # -倒序

5.show_detail_fields 在列表頁提供快速顯示詳情資訊

show_detail_fields = ['id',]

6.list_editable 在列表頁可以快速直接編輯的欄位

list_editable = ['name','age',]

7.refresh_times 指定列表頁的定時重新整理

refresh_times = [5, 10,30,60]  # 設定允許後端管理人員按多長時間(秒)重新整理頁面,選好之後就能自動重新整理了

8.list_export 控制列表頁匯出資料的可選格式

list_export = ('xls', 'json','csv')# 寫元組或者列表都行   list_export設定為None來禁用資料匯出功能
list_export_fields = ('id', 'btitle', 'bpub_date') # 設定允許匯出的欄位

9.show_bookmarks 控制是否顯示書籤功能

show_bookmarks = True #False就隱藏了這個功能

10.data_charts 控制顯示圖表的樣式

data_charts = {
        "order_amount": {  #隨便寫的名稱order_amount
          'title': '圖書釋出日期表', 
          "x-field": "bpub_date", 
          "y-field": ('btitle',),
          "order": ('id',),
          
        },
    #    支援生成多個不同的圖表
    #    "order_amount2": {
    #      'title': '圖書釋出日期表', 
    #      "x-field": "bpub_date", 
    #      "y-field": ('btitle',),
    #      "order": ('id',)
    #    },
    }
  • title 控制圖示名稱

  • x-field 控制x軸欄位

  • y-field 控制y軸欄位,可以是多個值

  • order 控制預設排序

11.model_icon 控制選單的圖示【圖示的設定可以參考font-awesome的圖示css名稱】

model_icon = 'fa fa-gift'

12.readonly_fields 在編輯頁面的只讀欄位

readonly_fields = ['name',]

13.exclude 在編輯頁面隱藏的欄位,比如判斷這個資料是否刪除的delete_status欄位,一般就是用來標識一下欄位是不是被刪除了,但是資料庫中不刪除

exclude = ['name',]

14.這並不是所有功能,可以參看它的文件,它提供的一些功能我們可能還需要自定製,調整或者新增一些它沒有的功能,後面再說

2.專案環境搭建

1.外部依賴

  1. 註冊支付寶的開發者賬號[https://open.alipay.com],註冊一下賬號就可以了,剩下的以後再說

  2. 註冊容聯雲簡訊介面平臺的賬號[d]

  3. 註冊保利威視訊服務平臺的賬號[暫時別註冊,因為有個7天免費測試期,如果到時候過期了就沒法用了,網址:http://www.polyv.net/?f=baiduPZ&utm_term=%E4%BF%9D%E5%88%A9%E5%A8%81]

  4. 註冊gitee[碼雲]的賬號

  5. 註冊阿里雲賬號,如果可以購買一個伺服器和域名, 或者第一次使用的可以申請一個免費外網伺服器

  6. 如果有條件的,可以申請一個域名進行備案[ICP備案和公安部備案],如果沒有的話, 可以註冊natapp[內網穿透]

2.依賴包安裝

pip install django -i https://pypi.douban.com/simple/ # 注意:在虛擬環境中安裝第三方包的時候,不要使用sudo,因為sudo是以管理員身份來安裝,會將安裝的東西安裝到全域性中去,而不是在虛擬環境中,並在linux系統下不要出現中文路徑

pip install djangorestframework -i https://pypi.douban.com/simple/

pip install PymySQL -i https://pypi.douban.com/simple/

pip install Pillow -i https://pypi.douban.com/simple/

pip install django-redis -i https://pypi.douban.com/simple/

3.搭建專案

1.建立專案並開啟專案

cd ~
mkdir luffy
cd luffy
django-admin startproject luffyapi

2.調整目錄結構

luffy/
  ├── docs/          # 專案相關資料儲存目錄
  ├── luffycity/     # 前端專案目錄
  ├── luffyapi/      # 後端專案目錄
       ├── logs/          # 專案執行時/開發時日誌目錄
       ├── manage.py
       ├── luffyapi/      # 專案主應用,開發時的程式碼儲存
       │    ├── apps/      # 開發者的程式碼儲存目錄,以模組[子應用]為目錄儲存(包)
       │    ├── libs/      # 第三方類庫的儲存目錄[第三方元件、模組](包)
       │    ├── settings/  #(包)
       │         ├── dev.py   # 專案開發時的本地配置
       │         ├── prod.py  # 專案上線時的執行配置
       │         ├── test.py  # 測試人員使用的配置(我們們不需要)
       │    ├── urls.py    # 總路由(包)
       │    ├── utils/     # 多個模組[子應用]的公共函式類庫[自己開發的元件]
       └── scripts/       # 儲存專案運營時的指令碼檔案

在編輯中開發專案時,必須指定專案目錄才能執行,例如,開發後端專案,則必須選擇的目錄是luffyapi

# 上面的目錄結構圖,使用Ubuntu的命令tree輸出的。
如果沒有安裝tree,可以使用 sudo apt install tree,就有了。

# 注意:建立資料夾的時候,是建立包(含init.py檔案的)還是建立單純的資料夾,看目錄裡面放的是什麼,
# 1. 如果放的是py檔案相關的程式碼,最好建立包
# 2. 如果不是,那就建立單純的資料夾。

3.關於配置檔案

開發者本地的環境、目錄、資料庫密碼和線上的伺服器都會不一樣,所以我們的配置檔案可以針對不同的系統分成多分.

  1. 在專案主應用下,建立一個settings的配置檔案儲存目錄

  2. 根據線上線下兩種情況分別建立2個配置檔案 dev.py和prod.py

  3. 把原來專案主應用的 settings.py配置內容複製2份到dev.py和prod.py裡面

  4. 把原來的settings.py配置檔案修改檔名或者刪除

新的目錄settings:

4.建立git程式碼版本

cd進入到自己希望儲存程式碼的目錄路徑,並建立本地倉庫.git【pycharm直接開啟終端就是專案根目錄了。無須cd了】新建立的本地倉庫.git是個空倉庫

cd 目錄路徑
git init

3.Git

1.Git基礎命令

git init # 在當前目錄建立一個空倉庫
git status # 檢視當前專案的版本狀態
git add 程式碼目錄   # 新增程式碼到上傳佇列
git commit -m '新增專案程式碼'  # 提交程式碼到本地倉庫, -m 表示本次提交的描述

2.配置使用者名稱和郵箱

git config --global user.name 'xxx'
git config --global user.email 'xxx@163.com'

3.在gitee平臺建立遠端倉庫

1.在gitee上建立一個遠端倉庫

2.如何將gitee遠端倉庫的程式碼克隆到本地

git clone 倉庫地址
# 注意,如果當前目錄下出現git倉庫同名目錄時,會克隆失敗。
'''
注意:我們當前專案不需要這個步驟
這個步驟是 當以後我們進入公司裡面,參與人家已經在做的專案時,別人已經有倉庫了,
但是我們是新人加入專案中的,那麼我們不需要在自己本地進行git init,直接git clone 複製別人的倉庫程式碼
'''

4.git分支

git branch dev      # 建立本地分支dev,dev是自定義
git checkout dev    # 切換本地分支程式碼
git checkout -b dev   # 這裡是上面兩句程式碼的簡寫

5.將原生程式碼推送到遠端

git push origin dev:dev # 將本地的dev分支推送到遠端主機的dev分支

1.如果推送程式碼,出現以下提示: git pull ....,則表示當前本地的程式碼和線上的程式碼版本不同.

# 1. 把線上的程式碼執行以下命令,拉取到本地,進行同步
git pull # 從遠端獲取程式碼併合並本地的版本

# 2. 根據提示,移除多餘的衝突的檔案,也可以刪除.
完成這些步驟以後,再次add,commit,push即可.

2.接下來,我們就把上面建立好的本地專案提交到gitee碼雲上面

# .表示當前目錄下所有的檔案或目錄提交到上傳佇列[上傳佇列也叫"暫存區"]
git add .

# 把本地上傳佇列的程式碼提交到本地倉庫
git commit -m "專案初始化搭建"

# 給本地的git版本控制軟體設定專案的遠端倉庫地址
git remote add origin https://gitee.com/mooluo/luffyproject.git

# 提交程式碼給遠端倉庫
git push -u origin master

6.一些擴充套件指令

# 擴充套件:
'''
1. 通過 git status 可以檢視當前專案的程式碼版本狀態
2. 通過 git reflog 可以檢視程式碼版本日誌[簡單格式]
3. 通過 git log    可以檢視程式碼版本日誌[詳細格式]
4. 刪除分支 git branch -D 分支名稱
   注意,不能刪除當前所在分支,必須切換到別的分支上才能進行刪除
'''

到此,成功提交了程式碼版本到gitee平臺。

7..gitignore

雖然成功移交了程式碼版本,但是一些不需要的檔案也被提交上去了。

所以,我們針對一些不需要的檔案,可以選擇從程式碼版本中刪除,並且使用.gitignore把這些垃圾檔案過濾掉。

git rm 檔案  # 刪除單個檔案
git rm -rf 目錄  # 遞迴刪除目錄

# 以下操作建議通過終端來完成,不要使用pycharm提供,否則刪除.idea還會繼續生成。
git rm -rf .idea
git rm db.sqlite3
# 注意,上面的操作只是從專案的原始碼中刪除,但是git是不知情的,所以我們需要同步。
git add .
git commit -m "刪除不必要的檔案或目錄"
git push -u origin master

使用.gitignore把一些垃圾檔案過濾掉

vim .gitignore

./idea
./idea/*
./git
./db.sqlite3

我們在開發時我們經常會使用pycharm的提供的git管理工具來完成程式碼的拉取和推送。

4.日誌配置

在settings/dev.py檔案中追加如下配置:

# 日誌配置
LOGGING = {
    'version': 1,  #使用的python內建的logging模組,那麼python可能會對它進行升級,所以需要寫一個版本號,目前就是1版本
    'disable_existing_loggers': False, #是否去掉目前專案中其他地方中以及使用的日誌功能,但是將來我們可能會引入第三方的模組,裡面可能內建了日誌功能,所以儘量不要關閉。
    'formatters': { #日誌記錄格式
        'verbose': { #levelname等級,asctime記錄時間,module表示日誌發生的檔名稱,lineno行號,message錯誤資訊
            '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': { #在debug=True下產生的一些日誌資訊,要不要記錄日誌,需要的話就在handlers中加上這個過濾器,不需要就不加
            '()': 'django.utils.log.RequireDebugTrue',
        },
        'require_debug_false': { #和上面相反
            '()': 'django.utils.log.RequireDebugFalse',
        },
    },
    'handlers': { #日誌處理方式,日誌例項
        'console': { #在控制檯輸出時的例項
            'level': 'DEBUG', #日誌等級;debug是最低等級,那麼只要比它高等級的資訊都會被記錄
            'filters': ['require_debug_true'], #在debug=True下才會列印在控制檯
            'class': 'logging.StreamHandler', #使用的python的logging模組中的StreamHandler來進行輸出
            'formatter': 'simple'
        },
        'file': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            # 日誌位置,日誌檔名,日誌儲存目錄必須手動建立
            'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/luffy.log"), #注意,你的檔案應該有讀寫許可權。
            # 日誌檔案的最大值,這裡我們設定300M
            'maxBytes': 300 * 1024 * 1024,
            # 日誌檔案的數量,設定最大日誌數量為10
            'backupCount': 10,
            # 日誌格式:詳細格式
            'formatter': 'verbose',
              'encoding': 'utf-8',  # 設定預設編碼,否則列印出來漢字亂碼
        },
    },
    # 日誌物件
    'loggers': {
        'django': {  #和django結合起來使用,將django中之前的日誌輸出內容的時候,按照我們的日誌配置進行輸出,
            'handlers': ['console', 'file'], #將來專案上線,把console去掉
            'propagate': True, #冒泡:是否將日誌資訊記錄冒泡給其他的日誌處理系統,工作中都是True,不然django這個日誌系統捕獲到日誌資訊之後,其他模組中可能也有日誌記錄功能的模組,就獲取不到這個日誌資訊了
        },
    }
}

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('django')


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/dev.py配置檔案中新增

REST_FRAMEWORK = {
    # 異常處理
    'EXCEPTION_HANDLER': 'luffyapi.utils.exceptions.custom_exception_handler',
}

6.建立資料庫

1.建立一個名字為luffy的資料庫

create database luffy default charset=utf8mb4; -- utf8也會導致有些極少的中文出現亂碼的問題,mysql5.5之後官方才進行處理,出來了utf8mb4,這個是真正的utf8,能夠容納所有的中文,其實一般情況下utf8就夠用了。

2.為當前專案建立資料庫使用者[這個使用者只能看到這個資料庫]

create user luffy_user identified by 'luffy';
grant all privileges on luffy.* to 'luffy_user'@'%';
flush privileges;

mysql -u luffy_user -pluffy
select user(); #luffy_user

3.配置資料庫連線

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "HOST": "127.0.0.1",
        "PORT": 3306,
        "USER": "luffy_user",
        "PASSWORD": "luffy",
        "NAME": "luffy",
    }
}

4.在專案主模組的 __init__.py中匯入pymysql

import pymysql

pymysql.install_as_MySQLdb()

5.調整錯誤

a.資料庫版本錯誤

b.資料庫編碼解碼錯誤

luffyapi專案後端基本就配置完畢,下面就來進行luffyapi的前端配置:luffyapi前端配置傳送門

相關文章