python 全棧開發,Day85(Git補充,隨機生成圖片驗證碼)

昨日內容回顧

第一部分:django相關

1.django請求生命週期

    1. 當用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發給服務端
    請求頭和請求體中會包含瀏覽器的動做(action),這個動做一般爲get或者post,體如今url之中.
    2. url通過Django中的wsgi,再通過Django的中間件,最後url到過路由映射表,在路由中一條一條進行匹配,
    一旦其中一條匹配成功就執行對應的視圖函數,後面的路由就再也不繼續匹配了.
    3. 視圖函數根據客戶端的請求查詢相應的數據.返回給Django,而後Django把客戶端想要的數據作爲一個字符串返回給客戶端.
    4. 客戶端瀏覽器接收到返回的數據,通過渲染後顯示給用戶.


2. 什麼是wsgi

    wsgi 是web服務網關接口,它是一套協議。本質經過socket實現的服務端!它不是django特有的,它同時只能處理一個請求


3. 視圖函數
    - 請求相關的全部數據:request對象 
    
    - 響應相關:
    - HttpResponse(字符串)/HttpResponse(字節)/
    - render,本質調用HttpResponse
    - redirect

4. csrf原理?
    - 先發送get請求,在用戶瀏覽器上藏一個隨機字符串
    - 再次發送POST請求時,瀏覽器自動攜帶
5. ORM
    - exclude
    - only/defer
    - values/values_list
    - ...
    
6. django的session默認保存在哪裏?
    保存在數據庫中(用戶訪問量大則放置在緩存中)


第二部分:git相關

1. git是什麼?以及做用?其餘:svn、vss
    Git 是一個開源的分佈式版本控制軟件,用以有效、高速的處理從很小到很是大的項目版本管理

2. github是什麼?

    GitHub是一個基於Git的遠程文件託管平臺
    github提供公共服務
    
    
3. 除了github,還知作別的嗎?

    碼雲,gitlab

4. gitlab和github的區別?

    gitlab是開源軟件,公司能夠本身安裝管理,代碼是私有的
    github是全球用戶使用的,代碼的公開的
    
5. 例句5個經常使用的git命令
    git init
    git add
    git commit
    git push
    git clone

6. 使用git開發規範是什麼?
至少有2個分支,master和dev
master是部署在生產環境的分支,不能直接修改,只能合併
dev 是開發分支,由開發人員提交

7. 若是bug怎麼解決?
    在master分支的基礎上,建立debug分支。修復後,合併到master分支
View Code

1、Git補充

git pull

將遠程存儲庫中的更改合併到當前分支中html

舉例:拉取最新的dev分支代碼python

git pull orgin dev 

等價於:git

git fetch origin dev 
git merge origin/dev

約等於(不分叉):程序員

git fetch origin dev 
git rebase origin/dev

git rebase

rebase命令可使咱們的提交歷史乾淨、簡潔!github

看下面的結果圖,是比較亂的web

使用下面2命令解決面試

git fetch origin dev
git rebase origin/dev

面試題:大家是否作代碼review?
再建立一個review的分支,由組長老大(資深的開發)來進行查看。數據庫

 

issue

進行項目問題的討論 django

打開github項目,這裏有一個issue瀏覽器

有些公司項目,都是用issues進行提問的。好比項目中遇到什麼問題,該如何解決?

而不是直接找人去提問,由於你們都很忙,忙着寫代碼!

固然了,這個得看公司。有些公司直接用QQ交流,或者直接當面提問!

wiki

這個就是知識庫,列舉一些項目中,遇到比較多的問題!避免重複提問。

通常是寫接口文檔,哪一個接口,對應的是哪一個功能,若是調用,參數是什麼。新手一看,就懂了!

 

tag

版本管理,通常咱們下載一些開源項目,好比django,它會有不少版本。

https://github.com/django/django/releases

語法,請參考連接:

http://www.javashuo.com/article/p-hxhxlhoa-be.html

在公司裏,上線一個功能後,會打一個tag。方便回顧操做!

那麼問題來了,直接使用commit id就能夠回滾,爲何還要使用tag回滾呢?

由於上線一個功能,衝突經歷了屢次提交,產生了不少個commit id。若是要回滾到某一個功能時,查到到具體的某一個commit id,很是麻煩。而tag不同,只有一個版本。那麼這個版本,包含了多個commit id。因此回滾時,很是方便!

最後:

對於我的,項目都須要使用git管理。最好使用git命令方式,不然命令都會忘記的!

在公司,得分狀況了!若是上頭不容許使用GUI客戶端,那麼只能使用命令行方式。

若是公司有50%以上的程序員在GUI客戶端,那麼就可使用客戶端。推薦使用SourceTree

 

2、隨機生成圖片驗證碼

Python隨機生成圖片驗證碼,須要使用PIL模塊.

安裝:

pip3 install pillow

1. 建立圖片

from PIL import Image
 
img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
# 在圖片查看器中打開
# img.show()
# 保存在本地
with open('code.png', 'wb') as f:
    img.save(f, format='png')
View Code

參數說明:

mode=''RGB' 表示以RGB來表示顏色

size=(120,30)  表示座標

color=(255, 255, 255) 表示白色

 

打開Python文件所在的目錄,裏面有一個code.png,打開

它是一個白底的圖片

 

2. 建立畫筆

用於在圖片上畫任意內容

from PIL import Image, ImageDraw

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
#在圖片查看器中打開
img.show()
View Code

注意:img.show()  會調用系統默認的圖片管理工具

查看圖片,效果同上!

 

3. 畫點

from PIL import Image, ImageDraw

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一個參數:表示座標
# 第二個參數:表示顏色
draw.point([100, 20], fill='red')
draw.point([60, 10], fill=(0, 255, 0))
# img.show()
# 保存在本地
with open('code.png', 'wb') as f:
    img.save(f, format='png')
View Code

打開圖片,放大點看,會有2個顏色的點

那麼這2個點,爲何會出如今這裏呢?

查看座標的象限,參數連接:

https://baike.baidu.com/item/%E8%B1%A1%E9%99%90/10223942?fr=aladdin

這是初中的知識,因而可知。它用的是第四象限,只不過,它的y座標,都是正數!

那麼也就正好解釋了,紅色點的位置!

注意:整個圖片的區域是座標是120,30。若是超過這個區域,那麼點沒法顯示!

 

4. 畫線

from PIL import Image, ImageDraw

img = Image.new(mode='RGB', size=(1200, 300), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一個參數:表示起始座標和結束座標
# 第二個參數:表示顏色
draw.line((100, 100, 100, 300), fill='red')
# 左100,上100,右100,下300;至關於(100,100)到(100,300)的直線
draw.line((100, 200, 300, 100), fill=(120, 120, 120))
# 左100,上200,右300,下100,至關於(100,200)到(300,100)的直線
draw.line((100, 100, 300, 100), fill=(0, 255, 255))
# 左100,上100,右300,下100,至關於(100,100)到(300,100)的直線
# img.show()
# 保存在本地
with open('code.png', 'wb') as f:
    img.save(f, format='png')
View Code

效果以下:

 

5. 畫圓

from PIL import Image, ImageDraw

img = Image.new(mode='RGB', size=(1200, 300), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')

draw.arc((50, 50, 250, 250), 0, 360, fill='red')
# 第一個參數:表示起始座標和結束座標(圓要畫在其中間)
# 第二個參數:表示開始角度
# 第三個參數:表示結束角度
# 第四個參數:表示顏色
# img.show()
# 保存在本地
with open('code.png', 'wb') as f:
    img.save(f, format='png')
View Code

效果以下:

 

6. 寫文本

from PIL import Image, ImageDraw

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')

draw.text([0, 0], 'python', 'red')
# 第一個參數:表示起始座標
# 第二個參數:表示寫入內容
# 第三個參數:表示顏色
# img.show()
# 保存在本地
with open('code.png', 'wb') as f:
    img.save(f, format='png')
View Code

效果以下:

 

 

7. 特殊字體文字

from PIL import Image, ImageDraw, ImageFont

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')

font = ImageFont.truetype('kumo.ttf', 28)
# 第一個參數:表示字體文件路徑
# 第二個參數:表示字體大小

draw.text([0, 0], 'python', 'red', font=font)
# 第一個參數:表示起始座標
# 第二個參數:表示寫入內容
# 第三個參數:表示顏色
# 第四個參數:表示字體
# img.show()
# 保存在本地
with open('code.png', 'wb') as f:
    img.save(f, format='png')
View Code

注意:字體文件下載猛戳這裏

效果以下:

 

 

圖片驗證碼

import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter


def check_code(width=120, height=30, char_length=5, font_file='kumo.ttf', font_size=28):
    code = []
    img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
    draw = ImageDraw.Draw(img, mode='RGB')

    def rndChar():
        """
        生成隨機字母
        :return:
        """
        return chr(random.randint(65, 90))

    def rndColor():
        """
        生成隨機顏色
        :return:
        """
        return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))

    # 寫文字
    font = ImageFont.truetype(font_file, font_size)
    for i in range(char_length):
        char = rndChar()
        code.append(char)
        h = random.randint(0, 4)
        draw.text([i * width / char_length, h], char, font=font, fill=rndColor())

    # 寫干擾點
    for i in range(40):
        draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())

    # 寫干擾圓圈
    for i in range(40):
        draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
        x = random.randint(0, width)
        y = random.randint(0, height)
        draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor())

    # 畫干擾線
    for i in range(5):
        x1 = random.randint(0, width)
        y1 = random.randint(0, height)
        x2 = random.randint(0, width)
        y2 = random.randint(0, height)

        draw.line((x1, y1, x2, y2), fill=rndColor())

    img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
    return img, ''.join(code)


if __name__ == '__main__':
    # 1. 直接打開
    # img,code = check_code()
    # img.show()

    # 2. 寫入文件
    img,code = check_code()
    with open('code.png','wb') as f:
        img.save(f,format='png')

    # 3. 寫入內存(Python3)
    # from io import BytesIO
    # stream = BytesIO()
    # img.save(stream, 'png')
    # stream.getvalue()

    # 4. 寫入內存(Python2)
    # import StringIO
    # stream = StringIO.StringIO()
    # img.save(stream, 'png')
    # stream.getvalue()
View Code

字體文件用的是上面的

效果以下:

 

登陸頁面增長驗證碼

修改urls.py,增長路徑code

from app01 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login),
    path('code/', views.code),
]
View Code

修改views.py,增長視圖函數

from django.shortcuts import render,HttpResponse,redirect
from utils.code import check_code

def code(request):
    """
    生成圖片驗證碼
    :param request:
    :return:
    """
    img,random_code = check_code()
    request.session['random_code'] = random_code
    from io import BytesIO
    stream = BytesIO()
    img.save(stream, 'png')
    return HttpResponse(stream.getvalue())

def login(request):
    """
    用戶登錄
    :param request:
    :return:
    """
    if request.method == 'GET':
        return render(request,'login.html')
    user = request.POST.get('user')
    pwd = request.POST.get('pwd')
    code = request.POST.get('code')
    if code.upper() != request.session['random_code'].upper():
        return render(request,'login.html',{'msg':'驗證碼錯誤'})

    if user == 'xiao' and pwd == '123':
        return redirect('http://www.py3study.com')

    return render(request, 'login.html', {'msg': '用戶名或密碼錯誤'})
View Code

和mange.py的同級路徑,建立目錄util,在裏面建立文件code.py

import random
from PIL import Image,ImageDraw,ImageFont,ImageFilter
def check_code(width=120, height=30, char_length=5, font_file='kumo.ttf', font_size=28):
    code = []
    img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
    draw = ImageDraw.Draw(img, mode='RGB')

    def rndChar():
        """
        生成隨機字母
        :return:
        """
        return chr(random.randint(65, 90))

    def rndColor():
        """
        生成隨機顏色
        :return:
        """
        return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))

    # 寫文字
    font = ImageFont.truetype(font_file, font_size)
    for i in range(char_length):
        char = rndChar()
        code.append(char)
        h = random.randint(0, 4)
        draw.text([i * width / char_length, h], char, font=font, fill=rndColor())

    # 寫干擾點
    for i in range(40):
        draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())

    # 寫干擾圓圈
    for i in range(40):
        draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
        x = random.randint(0, width)
        y = random.randint(0, height)
        draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor())

    # 畫干擾線
    for i in range(5):
        x1 = random.randint(0, width)
        y1 = random.randint(0, height)
        x2 = random.randint(0, width)
        y2 = random.randint(0, height)

        draw.line((x1, y1, x2, y2), fill=rndColor())

    img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
    return img, ''.join(code)
View Code

在tempaltes目錄建立login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="post">
        {% csrf_token %}
        <p>
            <input type="text" name="user" placeholder="用戶名" />
        </p>
        <p>
            <input type="password" name="pwd" placeholder="密碼" />
        </p>
        <p>
            <input type="text" name="code" placeholder="驗證" />
            <img onclick="changeImg(this);" src="/code/" alt="" title="點擊更換">
        </p>
        <input type="submit" value="提交">{{ msg }}
    </form>
    <script>
        function changeImg(ths) {
            ths.src = ths.src + '?';
        }
    </script>
</body>
</html>
View Code

將字體文件kumo.ttf放到和mange.py同級目錄

下載連接以下:

https://github.com/py3study/cnblog/blob/master/kumo.ttf

 

先來訪問驗證碼連接:

http://127.0.0.1:8000/code/

若是出現如下錯誤,表示找不到字體文件kumo.ttf

正常狀況下,應該是這樣的

亂碼先無論,它是一個二進制的數據,網頁是不能直接渲染的。須要由BytesIO模塊來處理!

 

訪問登陸頁面,驗證碼就出來了!

輸入一個錯的,提示錯誤

輸入一個正確的

跳轉頁面

 

今日做業:

組長建立一個項目,建立一個組,將組成員添加一一添加。

將各自寫的博客系統代碼提交到我的分支!登陸頁面,必須增長驗證碼功能!

 

使用的git命令以下:

 

生成ssh祕鑰,一路狂回車
ssh-keygen

聲明身份
git config --global user.name "肖祥"
git config --global user.email "xx@qq.com"

克隆代碼
git clone git@github.com:Money-set/s11_menoy.git
建立我的分支
git branch xiaoxiang
切換到我的分支
git checkout xiaoxiang
複製代碼到此目錄
添加到暫存區
git add .
提交文件
git commit -m "xiao的博客系統"

提交到遠程分支
git push origin master

 


參考資料:

Django 基礎教程

轉載聲明:
做者:肖祥
出處: https://www.cnblogs.com/xiao987334176/

相關文章
相關標籤/搜索