專案基礎 pip換源 虛擬環境介紹和搭建 luffy後臺配置 配置日誌 處理全域性異常
阿新 • • 發佈:2022-04-19
今日內容概要
- 專案基礎
- pip換源
- 虛擬環境介紹和搭建
- luffy後臺配置
- 配置日誌
- 處理全域性異常
內容詳細
1、專案基礎
1.1 企業中專案型別
1 商城類的---》某某團
2 入口網站[企業站和門戶站
新加坡--》遊戲的展示頁面
展示頁面
3 社交網路
app後端
4 諮詢論壇
技術類---》賣課,賣資料
5 內部系統---》python做這種多
辦公管理,人事管理,進銷存,客戶關係管理(crm)
自動化運維專案
自動化測試專案
6 個人部落格
7 內容收費網站
1.2 企業專案開發流程
# 公司專案來源 公司需要用 給客戶定製 網際網路專案 # 立項 需求分析(產品經理,技術人員)---》產品原型--->前端後端 # 前端:根據原型圖:ui+前端---》ui切圖---》前端實現---》mock資料(自己造的假資料) # 後端:確立專案架構,技術選型----》需求說明書+原型圖---》開發介面,自己測試--》介面文件 # 前後端程式碼整合---》前後端聯調---》整合測試(測試部,質量控制部) # 上線 # 你們的工作流程:在公司專案管理平臺(禪道)---》看自己任務----》確定需求(測試,問領導,問同事)---》寫程式碼--》提交到git倉庫---》管理平臺把需求設定成完成 # 軟體開發模式 瀑布模式:早期被廣泛採用的軟體開發模型---》bbs專案 敏捷開發:不停的開發--》測試---》上線轉圈 scrum---》Sprint週期(小功能從開發到完成的時間)---》1周 不做整體資料庫的設計---》寫到哪個版塊,再去設計相關表 # 路飛專案需求 首頁輪播圖 登陸註冊 多方式登陸,手機號登陸 手機號註冊 課程列表 過濾,排序 課程詳情 視訊播放,課程介紹 下單--》支付 支付寶支付 回撥修改訂單 上線
2、pip換源
# pip install pypi源下載原始碼,在國外,比較慢---》映象(pypi在國內備份)--->豆瓣,清華,阿里 # pip install -i 源地址 模組名 臨時生效 # 想以後只要 pip install django---》直接從國內下載 # 配置永久生效 # win平臺: 1、檔案管理器檔案路徑位址列敲: %APPDATA% 回車,快速進入到指定使用者目錄下:C:\Users\電腦使用者\AppData\Roaming 資料夾中(也可能為:C:\Users\Administrator\AppData\Roaming或其他類似的) 2、新建 pip 資料夾並在資料夾中新建 pip.ini 配置檔案 3、新增 pip.ini 配置檔案內容:以豆瓣源為例: [global] index-url = http://pypi.douban.com/simple [install] use-mirrors =true mirrors =http://pypi.douban.com/simple/ trusted-host =pypi.douban.com # MacOS、Linux 1、在使用者根目錄下 ~ 下建立 .pip 隱藏資料夾,如果已經有了可以跳過 mkdir ~/.pip 2、進入 .pip 隱藏資料夾並建立 pip.conf 配置檔案 cd ~/.pip && touch pip.conf 3、啟動 Finder(訪達) 按 cmd+shift+g 來的進入(此步也可能不需要) 輸入 ~/.pip 回車進入 4、新增 pip.conf 配置檔案內容 [global] index-url = http://pypi.douban.com/simple [install] use-mirrors =true mirrors =http://pypi.douban.com/simple/ trusted-host =pypi.douban.com # pycharm中換源,只針對於在pycharm中用 File | Settings | Project: xxx | Python Interpreter + Manage Repositories 搜尋源地址新增 # pycharm中的terminal不是和cmd一樣 # pypi Python官方模組站點,我們個人也可以傳模組 註冊賬號 寫一個模組 setup.py 上傳
3、虛擬環境介紹和搭建
3.1 pycharm設定虛擬環境
# 為什麼會出現虛擬環境?
假設有個專案django 1.11.8
又有個專案django 2.2.2
由於在系統的直譯器上只能裝一個django,導致同時只能跑一個專案
每個專案使用自己的一個直譯器---》虛擬環境--》通過系統直譯器創造出一個直譯器環境,他倆相互不干擾
系統有直譯器,
第一個專案有個虛擬環境 django1.11.8
第二個專案有個虛擬環境 django 2.2.2
以後變成,一個專案一個直譯器
# 其他語言相關方案
vue 專案路徑下--》node moduls---》這個專案依賴的環境--》刪除---》npm install
-go:go mod解決多版本共存問題
-java:maven解決多版本jar包問題
-python:虛擬環境
# python中虛擬環境解決方案有好幾個(virtualenv,pipenv。。。。)
# 如果不使用virtualenv,可以直接在pycharm中做
3.2 命令方式操作虛擬環境
3.2.1 win安裝
# centos沒有圖形化介面的話--->沒法裝pycharm---》沒法點點點建立,只能使用命令
## 第一步:安裝
pip3 install virtualenv # 虛擬環境模組--》建立虛擬環境麻煩
pip3 install virtualenvwrapper-win # 虛擬環境輔助模組---》更快捷方便的操作和管理虛擬環境
安裝完,在 python/scripts資料夾下就會有 virtualenv.exe和virtualenvwrapper.bat 批處理檔案
因為script資料夾又在環境變數裡--》這倆安裝命令可以在任意路徑下執行
## 第二步:配置環境
新建環境變數:填入變數名與值
變數名:WORKON_HOME
變數值:自定義存放虛擬環境的絕對路徑
eg: WORKON_HOME: E:\Django
# 同步配置資訊(可忽略):
去Python3的安裝目錄 => Scripts資料夾 => virtualenvwrapper.bat => 雙擊
3.2.2 Mac linux安裝
## 第一步安裝
pip3 install -i https://pypi.douban.com/simple virtualenv
pip3 install -i https://pypi.douban.com/simple virtualenvwrapper
## 第二步:找到virtualenvwrapper
先找到virtualenvwrapper的工作檔案 virtualenvwrapper.sh,該檔案可以重新整理自定義配置,但需要找到它
MacOS可能存在的位置 /Library/Frameworks/Python.framework/Versions/版本號資料夾/bin
Linux可能所在的位置 /usr/local/bin | ~/.local/bin | /usr/bin
建議不管virtualenvwrapper.sh在哪個目錄,保證在 /usr/local/bin 目錄下有一份
如果不在 /usr/local/bin 目錄,如在 ~/.local/bin 目錄,則複製一份到 /usr/local/bin 目錄
-- sudo cp -rf ~/.local/bin/virtualenvwrapper.sh /usr/local/bin
### 第三步:配置環境變數
在 ~/.bash_profile 完成配置,virtualenvwrapper的預設預設存放虛擬環境路徑是 ~/.virtualenvs
WORKON_HOME=自定義存放虛擬環境的絕對路徑,需要自定義就解注
VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
# 在終端讓配置生效:
ource ~/.bash_profile
3.3 虛擬環境命令
# win安裝/Mac linux安裝 完成後
# 1、建立虛擬環境到配置的WORKON_HOME路徑下
選取預設Python環境建立虛擬環境:
mkvirtualenv 虛擬環境名稱
基於某Python環境建立虛擬環境,並進入到虛擬環境:
mkvirtualenv -p python2.7 虛擬環境名稱
mkvirtualenv -p python3.6 虛擬環境名稱
# 2、檢視已有的虛擬環境
workon
# 3、使用某個虛擬環境
workon 虛擬環境名稱
# 4、進入|退出 該虛擬環境的Python環境
python | exit()
# 5、為虛擬環境安裝模組
pip或pip3 install 模組名
# 6、退出當前虛擬環境
deactivate
# 7、刪除虛擬環境(刪除當前虛擬環境要先退出)
rmvirtualenv 虛擬環境名稱
3.4 補充環境變數
# 補充:
環境變數:在命令列下敲某個命令,為什麼能執行?---》要麼這個命令就在當前路徑下,要麼在環境變數的path路徑下, 如果能找到就執行,找不到就報錯
環境變數有兩種:
使用者環境變數--》當前使用者有效
系統環境變數--》所有人都有效
cmd敲python---》確認好,python到底是python2,還是python3,還是你的虛擬環境的python3
環境變數的上下順序
pip 和python 成對的,裝的模組,給python直譯器用的
pip3 install django
python3.6---》pip3 python3.10---》pip3
更有甚者:建立了虛擬環境---》虛擬環境有pip---》把虛擬環境的pip加入到了環境變數
通過起別名方式來多版本共存
python3.6 python3.10
pip3.6 pip3.10
4、luffy專案後臺建立
# 第一步:
先從cmd視窗建立虛擬環境
mkvirtualenv luffy_api
檢視已安裝模組包 pip list
提前下載指定版本django: pip install django==2.2.2
# 第二步:
使用pycharm建立後臺路飛專案
按圖所示選虛擬環境直譯器建立
配置drf模組:djangorestframework
4.1 專案目錄調整
# 建立apps資料夾:今後存放所有的app
# 建立setting資料夾:存放配置檔案
更改配置檔名稱:dev.py(開發階段專用)
複製一份配置檔案:pro.py(上線階段專用)
# 更改專案啟動配置檔案路徑:
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.setting.dev')
# 控制檯:python manage.py runserver 或者點綠色箭頭就可以啟動專案了
# 調整app的路徑,以後把所有app都放到luffy_api下的apps資料夾---》整潔
切換到apps路徑下:cd luffy_api/apps
執行建立app的命令:
python ../../manage.py startapp user
# 在dev.py中註冊app,執行報錯,報錯原因是找不到user這模組
原來直接寫app名字不報錯--》原因是app就在專案根路徑下(模組的查詢)--》由於專案的根路徑在環境變數中,app就在根路徑下,它能直接找到
現在的問題是apps路徑不在環境變數中,它就找不到
把apps的路徑加入到環境變數中--》要在專案的啟動時加--》啟動入口是配置檔案
到配置檔案中:寫入
import sys
# 把apps的路徑加入到環境變量了
sys.path.append(os.path.join(BASE_DIR, 'apps'))
以後在 INSTALLED_APPS中只需要寫app的名字註冊即可
# 新建 logs資料夾,luffy_api/lib資料夾,luffy_api/utils資料夾,script資料夾
# 測試階段執行沒問題,專案上線,使用uwsgi上線---》執行wsgi.py-->修改如下
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.setting.pro')
# 國際化
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
# 把 小luffy_api也就是BASE_DIR 也加入到環境變數
sys.path.append(BASE_DIR)
匯入模組的時候,只要從環境變數的路徑開始導就可以了,從小luffy_api路徑開始匯入即可
雖然pycharm報紅,但是沒有錯,點右鍵,把該路徑(在環境變數中的),做成source root即可
以後再從這個路徑下導包,不會報錯了
### 注意:以後匯入包
儘量用最短路徑匯入,如果從長路徑匯入--》路徑經過的py檔案都會去執行--》可能會導致迴圈匯入的問題
個人推薦用相對匯入
# from apps.user import models
from . import models 推薦用這個
py檔案中有相對匯入,這個py檔案不能作為指令碼執行
django專案中,由於沒有右鍵執行的指令碼,所以都可以用相對匯入
### 專案目錄結構
"""
├── luffy_api
├── logs/ # 專案執行時/開發時日誌目錄 - 包
├── luffy_api/ # 專案主應用,開發時的程式碼儲存 - 包
├── apps/ # 開發者的程式碼儲存目錄,以模組[子應用]為目錄儲存 - 包
├── libs/ # 第三方類庫的儲存目錄[第三方元件、模組] - 包
├── setting/ # 配置目錄 - 包
├── dev.py # 專案開發時的本地配置
└── prod.py # 專案上線時的執行配置
├── urls.py # 總路由
└── utils/ # 多個模組[子應用]的公共函式類庫[自己開發的元件]
├── manage.py # 指令碼檔案
└── scripts/ # 儲存專案運營時的指令碼檔案 - 資料夾
"""
5、luffy後臺配置
5.1 配置日誌
# 在配置檔案中加入 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': {
# 實際開發建議使用WARNING
'level': 'DEBUG',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'file': {
# 實際開發建議使用ERROR
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
# 日誌位置,日誌檔名,日誌儲存目錄必須手動建立,注:這裡的檔案路徑要注意BASE_DIR代表的是小luffyapi
'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': {
'handlers': ['console', 'file'],
'propagate': True, # 是否讓日誌資訊繼續冒泡給其他的日誌處理系統
},
}
}
### 在utils下建立 ,my_logging.py 寫入(注意檔名 不要與模組名重複):
import logging
# 創造一個logger物件,使用的是配置檔案中的django這個
logger = logging.getLogger('django')
### 以後使用,匯入直接用--》列印到控制檯和記錄到檔案中
from utils.my_logging import logger
logger.info("我執行了一下")
"""
如果報錯:
no such table: django_session
去到命令視窗執行:
python manage.py migrate(django1.9以後版本)
"""
5.2 處理全域性異常
# 建立:utils/excepiton.py
## 全域性異常捕獲
from rest_framework.views import exception_handler # 預設沒有配置,出了異常會走它
from rest_framework.response import Response
from utils.my_logging import logger
def common_exception_handler(exc, context):
res = exception_handler(exc, context)
if res:
res = Response(data={'code': 998, 'msg': res.data.get('detail', '伺服器異常,請聯絡系統管理員')})
else:
res = Response(data={'code': 999, 'msg': str(exc)})
request = context.get('request')
view = context.get('view')
logger.error('錯誤原因:%s,錯誤檢視類:%s,請求地址:%s,請求方式:%s' % (str(exc), str(view), request.path, request.method))
return res
# 配置檔案dev.py配置:
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'utils.exception.common_exception_handler' # 再出異常,會執行這個函式
}