目錄
1.Xadmin
1.Xadmin介紹
文件: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的站點管理類不用繼承
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自定製
list_display = ['id', 'btitle', 'bread', 'bcomment']
search_fields = ['id','btitle']
3.
list_filter = ['is_delete']
4.
ordering = ['-age',] # -倒序
5.
show_detail_fields = ['id',]
6.
list_editable = ['name','age',]
7.
refresh_times = [5, 10,30,60] # 設定允許後端管理人員按多長時間(秒)重新整理頁面,選好之後就能自動重新整理了
8.
list_export = ('xls', 'json','csv')# 寫元組或者列表都行 list_export設定為None來禁用資料匯出功能 list_export_fields = ('id', 'btitle', 'bpub_date') # 設定允許匯出的欄位
9.
show_bookmarks = True #False就隱藏了這個功能
10.
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',) # }, }
-
-
x-field 控制x軸欄位
-
y-field 控制y軸欄位,可以是多個值
-
order 控制預設排序
11.
model_icon = 'fa fa-gift'
12.
readonly_fields = ['name',]
13.
exclude = ['name',]
14.這並不是所有功能,可以參看它的文件,它提供的一些功能我們可能還需要自定製,調整或者新增一些它沒有的功能,後面再說
2.專案環境搭建
1.外部依賴
-
-
註冊容聯雲簡訊介面平臺的賬號[d]
-
註冊保利威視訊服務平臺的賬號[暫時別註冊,因為有個7天免費測試期,如果到時候過期了就沒法用了,網址:http://www.polyv.net/?f=baiduPZ&utm_term=%E4%BF%9D%E5%88%A9%E5%A8%81]
-
註冊gitee[碼雲]的賬號
-
註冊阿里雲賬號,如果可以購買一個伺服器和域名, 或者第一次使用的可以申請一個免費外網伺服器
-
如果有條件的,可以申請一個域名進行備案[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.關於配置檔案
-
在專案主應用下,建立一個settings的配置檔案儲存目錄
-
根據線上線下兩種情況分別建立2個配置檔案 dev.py和prod.py
-
把原來專案主應用的 settings.py配置內容複製2份到dev.py和prod.py裡面
-
把原來的settings.py配置檔案修改檔名或者刪除
新的目錄settings:
4.建立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
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.
import pymysql pymysql.install_as_MySQLdb()
5.調整錯誤
a.資料庫版本錯誤
b.資料庫編碼解碼錯誤
luffyapi專案後端基本就配置完畢,下面就來進行luffyapi的前端配置:luffyapi前端配置傳送門