上節回顧
DRF\VUE回顧:
# DRF
-1 前後端開發模式
-2 HTTP協議
-websocket協議
-cookie,session,token
-底層基於socket:三次握手四次揮手
-http協議版本升級:0.9 ,1.1 2.x:多路複用
-3 API介面
-4 postman
-5 序列化反序列化
-6 djangorestframework
-ajax:非同步的xml
-webservice:xml,restful:json
-web server:web伺服器 uwsgi,tomcat,nginx
<person>
<name>lqz</name>
<age>19</age>
</person>
-7 restful
-8 APIView:原始碼分析
-dispatch---》包裝了新的request,三大認證,全域性異常
-9 Request 物件原始碼分析:data,__getattr__
-10 請求與響應
-Requets:引數
-Response:引數
-11 序列化類:序列化和反序列化
-ModelSerializer,Serializer
-鉤子
-重寫create,update
-定製返回的格式:在序列化類中寫,表模型中寫
-多表關聯
-13 三大認證
-原始碼
-認證類
-許可權類
-頻率類
-14 過濾,排序,分頁
-15 jwt 認證
-三段式
-base64編碼
-開發重點:簽發,認證
-16 後臺管理:simpleui
-17 rbac
# VUE
-1 前端發展史
-2 漸進式的js框架,MVVM,單頁面應用,元件化開發
-瀏覽器只能認識:html,css,js
-編譯:編譯工具,vue-cli(webpack),vite
-import Vue from 'vue'
-src='./js/vue'
-3 插值語法 {{}}
-4 指令
-v-text
-v-html
-v-if v-else-if v-else
-v-show
-v-on @
-v-bind :
-v-for
-v-model
-自定義指令
-5 事件指令
-6 屬性指令
-7 class和style :字串,陣列,物件
-9 條件渲染
-10 列表渲染:v-for可以迴圈什麼
-11 v-model input
-12 input的事件:input,blur,change事件
-13 按鍵修飾符
-14 過濾案例:v-for 函式執行
-15 表單控制:checkbox,radio
-16 v-model進階 lazy,number,trim
-17 生命週期鉤子:setTimeout,setInterval
-18 與後端互動:axios
-19 計算屬性和監聽屬性
-20 minix
-21 外掛
-22 元件化開發
-23 元件間通訊:自定義屬性,自定義事件,ref屬性
-24 動態元件和keep-alive
-25 vue-cli建立vue的專案
-每個xx.vue 都有三部分
-26 es6的匯入匯出語法
export default
export const a=10
import xx from '路徑'
import {a} from '路徑'
-27 專案中整合axios,elementui
-28 vue3
setup函式
ref reactive
生命週期:組合式api寫
計算屬性和監聽屬性
hooks
toRefs
script標籤上 setup lang='ts'
setUp(){
const data=reactive({
name:'lqz',
age:19
})
return {
...toRefs(data)
}
}
-29 vuex
-30 vue-router
-31 vue3 vite構建預設的狀態管理器Pinia
專案回顧:
# 1 後端封裝logger
-把大字典複製到配置檔案
-在utils下寫一個common_logger.py 得到logger物件
# 2 全域性異常
-drf中,只需要寫一個函式,在配置檔案中配置一下,只要出了異常,就會走到異常處理函式
-記錄日誌
-統一返回格式
# 3 response二次封裝
-自己封裝一個APIResponse
-簡化response的使用,重寫__init__,在裡面呼叫父類的__init__完成真正的初始化
-Response(data={},headers={},status=200)
# 4 配置user表,開放media
-使用auth的user表做使用者表,擴寫欄位
-mobile,icon
-遷移
-開啟media訪問,在路由中加入
path('media/<path:path>', serve, kwargs={'document_root': settings.MEDIA_ROOT}),
# 5 前端建立配置,整合elementui,axios,jq,bootstrap,vue-cookies
-使用vue-cli建立luffy_city
-App.vue HomeView.vue
-App.vue 只有一個標籤 rout-view
-整合axios:npm install -S axios
-整合elementui
-整合bootsrap和jq
-整合vue-cookies,localStorage,sessionStroage
登入:Login.vue--->配置路由
input v-model繫結
button---》axios.post('').then(res=>{
token=res.data.token
this.$router.push('/')
})
檢視所有汽車
CarList.vue---->配置路由
crated---》axios--》陣列
v-for迴圈 刪除
-mock資料
今日內容
1 前端全域性樣式和js配置
# 對於 body div... 等html標籤都是有預設樣式的,所以我們要將其統一去掉
# 寫一個, 應用到專案中
# 後端介面的地址,統一寫,以後統一改
# 補充:
yarn裝上之後就沒有package-lock.json了,取而代之的是yarn-lock.json。
設定根元件的樣式:
檢視頁面:
發現這個樣式並沒有在整個頁面上生效,離最頂部還有一些距離,這部分沒有變為藍色。產生這個問題的原因是,html標籤是有預設樣式的。我們需要統一去掉預設樣式,所以可以寫一個global.css檔案來實現這個需求。
1.1 global.css
新建檔案assets/css/global.css
:
將如下程式碼複製到global.css
檔案中:
/* 宣告全域性樣式和專案的初始化樣式 */
body, h1, h2, h3, h4, h5, h6, p, table, tr, td, ul, li, a, form, input, select, option, textarea {
margin: 0;
padding: 0;
font-size: 15px;
}
a {
text-decoration: none;
color: #333;
}
ul {
list-style: none;
}
table {
border-collapse: collapse; /* 合併邊框 */
}
複製完之後還需要讓這些樣式生效,此時就需要引入main.js:
# 第二步:全域性生效 main.js中配置
// 使用全域性css樣式,只需要匯入就會生效
import '@/assets/css/global.css'
只要在main.js引入這個樣式,就會自動的應用到所有的頁面上。
以elementUI舉例:
由於瀏覽器只能識別原生的html程式碼,比如meta
、link
標籤。
我們在這裡使用import匯入樣式,實際上Vue-cli最後會把樣式編譯成link
、meta
這些標籤,並放置在一個個頁面上。而且link
標籤的路徑都是配好的,只要你在main.js匯入css檔案,Vue-cli就會幫你幹這個事。
1.2 settings.js
# 向後端傳送請求,請求地址測試階段 127.0.0.1:8000 --->後期上線,地址要變,如果在元件中吧地址寫死,以後,要改,每個都要改
# 寫一個全域性js,js中有個url地址,以後所有元件中傳送請求時,都是用這個url地址
# 匯入匯出
# 使用步驟:
# 第一步:新建
assets-js----settings.js
export default {
BASE_URL:'http://127.0.0.1:8000/api/v1'
}
# 第二步:在main.js中引入
// 引入settings.js,把settings物件放入到vue的原型中
import settings from "@/assets/js/settings";
Vue.prototype.$settings = settings
// 以後在任意元件中只需要 this.$settings.BASE_URL
# 第三步:在任意元件中使用
this.$settings.BASE_URL
this.$axios.get(this.$settings.BASE_URL+'/users').then(res=>{
})
前端向後端傳送請求,比如有一個測試地址如下:axios.get('http://127.0.0.1:8000/api/v1/movies/')
在頁面中這個地址是寫死的,後續上線需要使用另一個地址,這時再一個一個頁面的更換地址很麻煩。所以需要抽取一個公共的地址,存放在一個js檔案中,以後需要就使用。
建立settings.js檔案:
填寫如下程式碼:
export default {
BASE_URL:'http://127.0.0.1:8000/'
}
1.3 main.js
在main.js將settings.js匯入,加入Vue原型,以後可以透過this.$settings
使用這個BASE_URL。
//5 去掉所有標籤預設樣式
import '@/assets/css/global.css'
// 6 全域性配置
import settings from "@/assets/js/settings";
Vue.prototype.$settings=settings
使用全域性js的示例:
2 後端主頁模組介面
# 根據原型圖分析出來
1. 首頁輪播圖介面 ---> 一段時間之後會變化
2. 首頁推薦課程介面 ---> 比如:拿出銷量最高的課程
# 補充: https://zhuanlan.zhihu.com/p/444741981
-軟體開發模式:
-瀑布模式:bbs專案
對接需求 --> 設計架構、資料庫 --> 分任務開發 --> 開發完成再測試 --> 改bug --> 上線
-敏捷開發:路飛,管理軟體,
-bbs專案:設計資料庫---》全設計完了---》開始寫專案
-路飛:寫一塊設計一塊資料庫(根據需求變更設計表)
#1 建立一個app,寫輪播圖表
-python ../../manage.py startapp home
#2 編寫一個BaseMosel
class BaseModel(models.Model):
created_time = models.DateTimeField(auto_now_add=True, verbose_name='建立時間')
updated_time = models.DateTimeField(auto_now=True, verbose_name='最後更新時間')
is_delete = models.BooleanField(default=False, verbose_name='是否刪除') # 軟刪除,不真正的刪除資料,而使用欄位控制
is_show = models.BooleanField(default=True, verbose_name='是否上架')
orders = models.IntegerField(verbose_name='優先順序')
class Meta:
# 如果表遷移,這個表就會生成,我們們不能再資料庫生成這個表,就需要加這句
abstract = True # 虛擬表,只用來做繼承,不在資料庫生成
#3 編寫banner表
class Banner(BaseModel):
# 圖片地址,圖片名,圖片介紹,link地址
title = models.CharField(max_length=16, unique=True, verbose_name='名稱')
image = models.ImageField(upload_to='banner', verbose_name='圖片')
link = models.CharField(max_length=64, verbose_name='跳轉連結') # /course/
info = models.TextField(verbose_name='詳情') # 也可以用詳情表
class Meta:
db_table = 'luffy_banner'
verbose_name_plural = '輪播圖表'
def __str__(self):
return self.title
# 4 遷移兩條命令
三種開發模式
瀑布模式:
需求變化之後導致已經開發好的功能被棄用,新需求需要重新設計資料庫。
敏捷開發:
首頁板塊開發 --> 首頁板塊測試 --> 訂單板塊開發 --> 訂單開發測試 --> ...
敏捷開發管理軟體?
敏捷開發裡的一個sprint(週期)是多少?
其實就是開發一個小功能、測試完成、到上線的時間是多久。
大約這個時間是一週,差不多一個小功能開發結束了。每週都會開會,進行程式碼評審。(站立式會議--阿里)
DevOps:
開發首頁功能 ---> 測試首頁功能 --> 運維上線首頁 --> 開發訂單板塊 --> 測試訂單功能 --> 運維上線訂單功能
注意:這裡的上線,都是上線到測試環境。直接可以將產品給老闆、顧客看。
敏捷開發管理工具:scrum
模型父類BaseModel
# 輪播圖欄位
輪播圖是否刪除 、輪播圖是否展示、輪播圖上傳時間
# 課程欄位
課程是否刪除 、課程是否展示、課程上傳時間
# 發現這兩個表中有相同的欄位 ---> 抽象出來成一個公共的模型類BaseModel ---> 需要使用這些欄位就繼承
# 擴充套件
BaseModel不僅可以寫欄位,還可以寫方法。BaseModel的子類產生的物件,都可以使用這些方法。
# 語法:
def to_dict(self):
在此函式內透過反射將物件中的資料獲取,組織成字典
優點:無需使用序列化類,可以將所有欄位都序列化出來
缺點:不能控制欄位,每個欄位都會序列化
# 示例:
def to_dict(self):
return {k: v for k, v in self.__dict__.items() if not k.startswith('_')}
檢視BaseModel:
auto_now_add:建立時間。該欄位錄入該課程第一次建立的時間,之後不會改變。
auto_now: 最後更新時間。每次修改該課程,該欄位都會記錄當前時間。
軟刪除:不真正的刪除資料,而是使用欄位控制前端是否顯示某些資料。實際上資料還是存在資料庫。
如果表遷移,預設情況下,上述模型基類,也會生成一個表,這不是我們想要的。所以需要新增如下程式碼,使得遷移時不會生成表:
擴充套件:AbstractUser表也是一個抽象表。
abstract = True
:讓該類不再資料庫生成表,只用於做繼承。
將我們寫的模型基類的剪貼程式碼放到utils目錄下:
輪播圖模型類
# 擴充套件欄位
1.更新人欄位
2.建立人欄位 --> 只有建立人才能刪除這條欄位
檢視輪播圖模型類:
link地址:點選圖片會跳轉到Link地址。我們用資料庫一個欄位來儲存這個路徑。
模型表的描述資訊:
程式碼
# 建立表步驟
-第一步:在utils下新建 common_model.py
from django.db import models
class BaseModel(models.Model):
created_time = models.DateTimeField(auto_now_add=True, verbose_name='建立時間')
updated_time = models.DateTimeField(auto_now=True, verbose_name='最後更新時間')
is_delete = models.BooleanField(default=False, verbose_name='是否刪除')
is_show = models.BooleanField(default=True, verbose_name='是否上架')
orders = models.IntegerField(verbose_name='優先順序')
class Meta:
abstract = True # 只用來繼承,不用來在資料庫建立
-第二步:在home 的app的models.py中寫入
class Banner(BaseModel):
# 哪些欄位:真正圖片地址,標題,跳轉連結,圖片介紹 是否刪除(軟刪除),是否顯示,優先順序,建立時間,更新事件:公共欄位
title = models.CharField(max_length=16, unique=True, verbose_name='名稱')
image = models.ImageField(upload_to='banner', verbose_name='圖片')
link = models.CharField(max_length=64, verbose_name='跳轉連結')
info = models.TextField(verbose_name='詳情')
class Meta:
db_table = 'luffy_banner'
verbose_name_plural = '輪播圖表'
def __str__(self):
return self.title
-第三步:遷移
python manage.py makemigrations
python manage.py migrate
輪播圖介面編寫
# 1 分路由---》home的app中新建urls.py
from . import views
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register('banner', views.BannerView, 'banner')
urlpatterns = [
]
urlpatterns += router.urls
# 2 檢視函式中
from rest_framework.viewsets import GenericViewSet
# 獲取所有
from utils.views import CommonListModelMixin
from rest_framework.response import Response
class BannerView(GenericViewSet, CommonListModelMixin):
queryset = Banner.objects.all().filter(is_delete=False, is_show=True).order_by('orders')
serializer_class = BannerSerializer
# 3 utils下的view.py 中
from rest_framework.mixins import ListModelMixin
from utils.response import APIResponse
class CommonListModelMixin(ListModelMixin):
def list(self, request, *args, **kwargs):
res = super().list(request, *args, **kwargs)
return APIResponse(result=res.data)
# 4 序列化類 serializer.py
class BannerSerializer(serializers.ModelSerializer):
class Meta:
model = Banner
fields = ['title', 'image', 'link']
# 5 錄入資料 simpleui
-下載,註冊app,國際化
-建立超級使用者
-錄入資料
檢視類
查詢出is_delete
、is_show
都為True
的資料,並將其按照orders欄位排序,排序好之後,再進行序列化。
序列化類
# Form類和ModelForm的區別
類似於serializers和ModelSerializers。
Model表示和表做關聯。
先想好要給前端哪些資料:標題、(圖片、link連結)、簡介
路由分發
配置主路由:
# 語法
path('路徑',include('app名字.urls'))
# 示例
path('api/vi/home',include('home.urls'))
# postman請求示例:
127.0.0.1:8080/api/v1/home/xxx
127.0.0.1:8080/api/v1/home/分路由
配置分路由,使用自動生成路由:
此時可以訪問路由:127.0.0.1:8080/api/v1/home/banner/
自定義返回格式
由於我們需要自定義返回格式,新增上code\msg,所以需要重寫list方法:
方法一:使用drf Response:
檢視list方法的返回值,發現是一個Response物件,而這個物件裡包含著經過序列化類處理後的資料:
方法二:使用自己封裝的 APIResponse:
二次封裝ListModelMixin
由於所有檢視類都需要定製返回格式,所以我們可以二次封裝一個ListModelMixin,使用APIresponse定製返回格式。以後使用我們封裝的CommonListModelMixin即可。如果不進行封裝,我們需要每個檢視類都重寫List方法。
在utils目錄下新建views.py:
繼承ListModelMixin,並重寫:
直接匯入使用;
錄入資料
國際化配置:
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai' # 中國都用shanghai
使用django admin後臺新增資料:
3 跨域問題詳解,前後端打通
# 前後端互動會存在跨域問題
# 跨域問題出現的原因?
-同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會受到影響。可以說Web是構建在同源策略基礎之上的,瀏覽器只是針對同源策略的一種實現
請求的url地址,必須與瀏覽器上的url地址處於同域上,也就是域名,埠,協議相同.
比如:我在本地上的域名是127.0.0.1:8000,請求另外一個域名:127.0.0.1:8001一段資料
瀏覽器上就會報錯,這個就是同源策略的保護,如果瀏覽器對javascript沒有同源策略的保護,那麼一些重要的機密網站將會很危險
# 解決跨域問題
-1 前端代理
-2 nginx代理
-3 cors解決跨域
# cors:跨域資源共享,後端技術,核心就是在響應頭中加入資料,允許瀏覽器接受資料
CORS需要瀏覽器和伺服器同時支援,IE瀏覽器不能低於IE10
# CORS基本流程
瀏覽器將CORS請求分成兩類:
-簡單請求(simple request)
-非簡單請求(not-so-simple request)
# 簡單請求:
瀏覽器發出CORS簡單請求,只需要在頭資訊之中增加一個Access-Control-Allow-Origin欄位
# 非簡單請求
瀏覽器發出CORS非簡單請求,會在正式通訊之前,先傳送一個options請求,稱為”預檢”請求。
瀏覽器先詢問伺服器,當前網頁所在的域名是否在伺服器的許可名單之中,以及可以使用哪些HTTP動詞和頭資訊欄位。只有得到肯定答覆,瀏覽器才會發出正式的XMLHttpRequest請求,否則就報錯。(也就是如果允許,再發真正的請求)
# 什麼是簡單請求,什麼是非簡單請求
-滿足下面兩種情況,就是簡單請求
-1 請求方法是以下三種方法之一:
HEAD
GET
POST
-2 HTTP的請求頭資訊不超出以下幾種欄位:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限於三個值application/x-www-form-urlencoded、multipart/form-data、text/plain
舉例:POST 傳送json ---> 非簡單請求
# 解決跨域,使用cors技術,在響應中寫東西:如果自己寫,需要寫個中介軟體,每個請求都會走,在process_response中寫入下面的程式碼即可
def test(request):
print(request.method)
# 如果自己寫,需要寫個中介軟體,每個請求都會走,在process_response中寫入下面的程式碼即可
# 解決簡單請求
res=HttpResponse('ok')
res['Access-Control-Allow-Origin']='*'
# 解決非簡單請求
if request.method=='OPTIONS':
res['Access-Control-Allow-Headers'] = 'Content-Type'
return res
# 第三方模組,解決了這個問題,只需要整合進來,使用即可---》djagno
-第一步:安裝django-cors-headers
-第二步:註冊app
-第三步:中介軟體加入
-第四步:配置檔案配置
前端沒法主動重定向,所以向後端傳送請求時,一定要確定好加不加/
:
同源策略
訪問一個網址時,只要不指定埠(不寫埠),預設訪問的就是80埠。
如上圖80埠跑著我們的前端服務,從80埠向後端8080埠傳送請求,請求可以正常到達後端、後端也會正常的響應,返回響應資料。但是資料到了瀏覽器,瀏覽器會進行檢查,發現這個前端服務是在80埠,但是返回的資料是來自8080埠,這樣就會觸發同源策略,禁止接受這個資料。
同源策略不允許向不同的域發請求,只能是向同域發請求。
同域:也就是域名,埠,協議都相同。
也就是說只有寫網站,做前後端分離,才會涉及到這個問題。移動端app不會有這種問題,因為app不是瀏覽器,沒有同源策略。
DNS域名解析
# 域名解析查詢順序
本地的host檔案
檢視本地的host檔案:
沒有就建立一個
配置host檔案:
允許所有訪問:
域名解析:
跨域解決方案
載入cdn是否跨域?跨! --> 使用JSONP實現跨域
nginx反向代理:
nginx是裝在伺服器上的一個軟體。前端訪問80埠,從nginx獲取靜態頁面。前端再向nginx80埠傳送ajax請求但是路由改了(比如:127.0.0.1/api/v1)。nginx監聽80埠,發現路由是127.0.0.1/api/v1,而不是127.0.0.1,就會將請求轉發到django後端的8080埠
node代理伺服器:(不常用)
cors跨域資源共享 - 後端解決跨域
# 簡單請求
後端響應頭配置Access-Control-Allow-Origin欄位
前端直接傳送
# 非簡單請求
後端配置響應頭
前端傳送options請求進行預檢
前端傳送真正的請求
前端傳送簡單請求: GET
前端傳送非簡單請求:POST + json
axios post請求會預設傳送json格式的資料。
簡單請求跨域處理:
非簡單請求跨域處理:
這只是解決了攜帶content-type這個請求頭的問題,如果攜帶token還會出現跨域報錯。
第三方跨域中介軟體(最終解決方案)
正常處理跨域問題,需要寫一箇中介軟體,每個請求都會經過中介軟體的 process_response方法,然後就可以在 process_response方法裡給響應頭加東西。
最終解決,使用第三方模組django-cors-headers。這個模組實際就是幫我們寫了一箇中介軟體。但是這個模組只能解決django的跨域,使用其他框架也需要解決跨域,所以會自己寫中介軟體為好。
使用django-cors-headers為什麼需要在配置檔案中配置?
因為這樣可以在全域性生效,我們在響應頭加東西,只能在當前檢視函式生效。
配置說明:
CORS_DRIGIN_ALLOW_ALL = True # 允許所有的域向此後端傳送簡單請求
CORS_ALLOW_METHODS = {
'DELETE',
'GET',
...,
...,
} # 允許這些請求方式
CORS_ALLOW_HEADERS = {
'authorization',
'content-type',
...,
} # 允許這些請求頭
檢視中介軟體:
如果CORS_DRIGIN_ALLOW_ALL = True
,在響應頭新增Access-Control-Allow-Origin="*"
:
獲取配置檔案中寫到的請求方式、請求頭,新增到響應中:
自定義中介軟體
views.py:
def test(request):
import json
obj=HttpResponse(json.dumps({'name':'lqz'}))
# obj['Access-Control-Allow-Origin']='*'
obj['Access-Control-Allow-Origin']='http://127.0.0.1:8004'
return obj
放到中介軟體處理複雜和簡單請求:
from django.utils.deprecation import MiddlewareMixin
class CorsMiddleWare(MiddlewareMixin):
def process_response(self,request,response):
if request.method=="OPTIONS":
#可以加*
response["Access-Control-Allow-Headers"]="Content-Type"
response["Access-Control-Allow-Origin"] = "http://localhost:8080"
return response
4 自定義配置
# 有些公共配置資訊,放到單獨一個配置檔案中
# 新建一個common_settings.py
# 輪播圖顯示的條數
BANNER_COUNT = 3
# 在dev.py 中匯入
from settings.common_settings import *
# 查詢所有輪播圖介面中
queryset = Banner.objects.all().filter(is_delete=False, is_show=True).order_by('orders')[:settings.BANNER_COUNT]
前端使用get方法給後端傳送請求時,後端會返回所有的輪播圖,但有時候我們只想要其中的幾張,如果滿足這個需求?
對queryset進行切片:
但是這樣寫死了,以後想修改很麻煩。
可以在dev.py配置檔案新增自定義配置:BANNER_COUNT = 2
但是這樣改,只能在開發環境中生效,測試、上線環境也需要這些配置,所以我們可在settings資料夾內新建一個common_settings.py檔案,將這個配置放在common_settings.py檔案內。然後在dev.py中匯入common_settings.py:
在測試上線環境中,也將common_settings.py中的配置進行匯入即可。(這裡使用星號匯入了所有自定義配置)
5 git介紹和安裝
# 後端,寫了一個介面,完成了一個功能,在公司裡,功能完成,要把程式碼提交到遠端倉庫
# 公司裡協同開發,版本管理需要使用軟體:svn,git
# 協同開發的問題:
1.程式碼合併
2.版本升級 版本管理
需要有一臺機器自動做程式碼合併、版本管理 只要提交了程式碼就有記錄 透過記錄可以回退到某個版本。
# 下載:安裝在作業系統上
-https://git-scm.com/downloads
-一路下一步
-任意位置點右鍵,如果有兩個東西(【git gui here】 【git bash here】),表示安裝完成
這兩個必須勾選上:
5.1 pycharm中配置git
# github , gitee開源軟體,
# 下載成zip,使用pycharm開啟
# 使用pycharm直接呼叫git將程式碼拉下來,開啟---》配置pycharm
-settings中搜尋git,把git安裝可執行檔案配置好
# 以後下載開源軟體:vcs--->get from version contral--->填入路徑---》clone下來即可
在pycharm settings中搜尋git:
找到git的安裝路徑中的git可執行檔案:Git\bin\git.exe
找到之後點選Test,即可完成設定。
現在使用pycharm從gitee拉程式碼下來:
在pycharm中點選VCS:
將地址複製到如下:
點選clone,pycharm就會從gitee將程式碼拉下來,並且直接幫你開啟這個專案。也就不需要下載zip安裝包再使用pycharm開啟,省了一步。
5.1 svn,git ,github,gitee,gitlab
# svn:版本管理軟體,它是集中式的版本管理,必須有個svn的服務端,服務端如果過來,svn就用不了了
# git :版本管理軟體,它是一個分散式的版本管理,每個客戶端都可以作為服務端,即便服務端掛了,也能進行版本管理(本地管理)
# github:全球最大的開源遠端git倉庫,全球最大的開源倉庫,git遠端倉庫
-如果我要寫開源軟體,本地裝git,把程式碼提交到github
-python監控公司程式碼有沒有被傳到github
# gitee:中國最大的開源軟體倉庫 【私有倉庫,花錢買空間】
# gitlab:公司內部的遠端倉庫,運維搭建維護
擴充套件
前後端分離
主站一個前端、後臺管理一個前端,都訪問一個後端。
主站一個前端,後端多個:
抽獎功能直接新開一個後端服務,不影響原來的服務。(主專案用django,新開功能用flask)
練習
# 搜尋:wsgi,uWSGI,uwsgi
https://www.liuqingzheng.top/article/1/05-CGI,FastCGI,WSGI,uWSGI,uwsgi%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82/
# 前端的後臺管理模板
https://gitee.com/liuqingzheng/vue_admin