使用 python flask 框架實現一個簡單的抽獎系統
Flask 實現一個簡易的抽獎系統
項目前置知識
目前 python主流的框架: Django 、flask 、Tornado

簡介:
1.框架
框架? 為什莫使用框架? (前置知識講解比較冗雜,望諒解)
框架:英文名為 (Framework),意思是框架、機制、基準。最高源于建筑行業,現在框架這個概念使用十分廣泛,尤其是在軟件行業。 在軟件工程中,框架被定義為整個或部分系統的可重用設計,表現為一組可重用設計,是可被應用開發者定制的骨架。
通俗來說,一個框架是實現某種功能或者是項目的半成品,提供了一些常用的工具和一些基礎通用的組件,可以使開發人員在此基礎上,更高效的實現業務需求的設計。“使用框架,可以使開發者重復造輪子,而是直接調用其類或者函數就可以實現需求的功能 ”
? 舉個例子幫助大家理解,相信大家日常生活都了解過ppt。我們來看一下ppt的使用邏輯,當我們打開一個 office Power Point或者是WPS ,然后直接新建空白演示文稿就可以直接些內容,想要什么背景,字體,主題風格等,都可以直接在空白文稿中添加,實際上這個過程中,我們就在使用框架。還記得我們前面說的吧,框架是實現某種功能或者是項目的半成品,這里就和我們導入的ppt模板是一個道理,當我們導入一個ppt模板之后,只需要在里面添加我們要寫入的內容就可以了,不用再擔心字體庫、風格庫、動畫庫等。這些基礎內容都是框架搭建好的基礎支撐。
?
那我們做了這么多的贅述,其實就是想知道,我們為啥要在計算機行業使用框架,這個在前面其實已經提到了。互聯網軟件系統隨著業務的發展,變得越來越復雜,不同領域的業務所涉及到的知識、內容、問題非常非常多,那么一定程度上使用框架就可以避免程序員重復造輪子,使我們把重心放在要實現的功能上面。
2.python flask框架
? flask是python中基于WSGI的輕量級 web開發框架,也被我們稱之為web微框架。微框架中的"微" 表示flask的目標是保持核心簡單而又可擴展。flask不會替你做出很多決定,比如選用何種數據,使用何種模板引擎,這些在flask中都非常容易改變。"Flask可以變成你想要的任何東西,一切恰到好處,由你做主 "
這與python中最出名的Django框架形成了鮮明的對比。Django框架功能全面,它提供一站式解決方案,集成了MVT(Model-View-Template)和ORM(Object Relational Mapping),以及后臺管理。但是缺點也很明顯,它偏重。就像是一個已經裝修好的房子,它提供好了你想要的東西,直接拿去用就好了。

? Flask相對于Diango而言是輕量級的web框架。和Django不同,Flask輕巧、簡潔,通過定制第三方擴展來實現具體的功能。就像是已經刷好墻的房子,你想要什么家具就自己添加。
//flask 包下載之后,會自動下載依賴庫
Flask依賴于兩個外部庫——Werkceug和Jnija 2。Werkrcup是一個WSGI(在Web應用和多種服務器之間的標準Python接口)工具集,Jnija 2負責渲染模板。所以,在安裝Flask時,會自動安裝這兩個庫。
為了更好地管理Python應用,通常情況下會在虛擬環境中安裝Flask框架。安裝命令如下:
pip install flask
MarkupSafe 庫:附帶Jinjia,用于轉義渲染模板不受信任的輸入
itsDangerous:保護flask會話的cookie
Click庫:用于編寫命令行框架

用Flask實現隨機抽獎應用
1.基礎代碼
//新建項目后的第一個簡單的flask應用就誕生了
#導入庫
from flask import Flask
app = Flask(__name__) #創建一個Flask實例
@app.route('/')
def index(): # 視圖函數
return 'Hello World!'
if __name__ == '__main__':
app.run()
//那,這段代碼是什么意思呢?
¤ 導入Flask庫,定義Flask實例化對象app
¤ 實例化一個對象 app 時,傳入 __name__ :目的是接受包或者模塊的名稱作為參數,讓flask.helpers.get_root_path以便獲得靜態文件和模板文件的目錄 “__name__ 可以簡單認為代表目前這個文件。有了這個參數Flask會讀取參數所提供的文件的內容,來獲取app模板或是靜態文件。”
¤ 使用route() 裝飾器告訴Flask什么樣的URL能觸發執行被裝飾的函數。
這個裝飾函數就是視圖函數,它返回顯示在用戶瀏覽器中的信息。
¤ 使用run()函數來讓應用運行在本地服務器上。其中“ if _ name _ main _” 可確保服務器只在該腳本被Python解釋器直接執行時才會運行。
// if __name__ == '__main__' 解釋
¤ 由于pyton文件既可以做為一個腳本執行,也可以作為一個包被引用。 所以當我們只想讓他作為一個腳本被執行時,就可以使用 if __name__ == '__main__' 來限定。原因是因為 當 print(__name__)直接被當作腳本執行時,會返回__main__ ,但如果被當作包引入時,print則不會輸出任何結果。那么這個==判斷就會失效,該程序下面的run函數就不會被執行。
2.在pycharm中運行結果

3.開啟調試模式
雖然run() 方法使用于啟動本機的開發服務器,但是每次修改代碼后都要手動的重啟它,比較煩瑣,此時可是使用Flask 調試模式解決。
app.run(debug=True)
此外可以啊綁定ip和端口
app.run(host='0.0.0.0', port=80, debug=True)
0.0.0.0代表電腦所有的IP。80是HTTP網站服務的默認端口。什么是默認?比如,我們訪問網站http://www.example.com,其實是訪問的http://www.example.com:80,只不過:80可以省略不寫。
由于綁定了80端口,需要使用root權限運行server.py。也就是:
$ sudo python3 server.py
4.路由
客戶端(如Web瀏覽器)把請求發送給Web服務器后,Web服務器會把請求發送給Flask程序實例。程序實例需要知道對每個URL請求運行哪些代碼,所以保存了一個URL到Pybon函數的映射關系。處理URL和函數之間關系的程序稱為路由。
在Flask程序中,定義路由的最簡便方式是使用程序實例提供的app. route裝飾器,把裝飾的函數注冊為路由。路由映射關系如圖所示。

5.模板
模板是一個包含響應文本的文件,其中包含用占位變量表示的動態部分,其具體值只在請求的上下文中才能知道。使用真實值替換變量,再返回最終得到的響應字符串,這一過程稱為渲染。為了渲染模板,Flask使用了一個名為
Jinja2的強大模板引擎。
render_template('tempalta_name.html',temolate_val = name)
第一個參數是渲染的模板名稱 , 其余為模板中的變量的值
例如下面代碼中的 return render_template('index.html',hero1=hero,h = hero[num])
如果在視圖函數中調用代碼,則會渲染tempales目錄下的index.html模板文件,并將模板文件中的{{hero1}} 使用hero替代
6.項目代碼
// flask/app.py
// index.html是在tempales文件夾中,且tempales文件夾必須要與 運行的文件(調用它的文件app.py)同級。
from flask import Flask, render_template
from random import randint
app = Flask(__name__)
hero = ['安琪拉', '白起', '老夫子', '不知火舞', '妲己', '狄仁杰', '典韋', '韓信', '劉邦', '劉禪', '魯班七號', '墨子',
'孫臏', '孫尚香', '孫悟空',
'項羽', '亞瑟', '周瑜', '莊周', '蔡文姬', '武則天', '廉頗', '程咬金', '后羿', '扁鵲', '鐘無艷', '花木蘭',
'小喬', '王昭君', '虞姬', '甄姬',
'李元芳', '張飛', '劉備', '牛魔', '張良', '蘭陵王', '露娜', '東皇太一', '貂蟬', '達摩', '曹操', '羋月', '阿軻',
'高漸離', '鐘馗', '關羽',
'李白', '宮本武藏', '呂布', '嬴政', '娜可露露', '趙云', '姜子牙', '橘右京', '干將莫邪', '鬼谷子', '諸葛亮',
'安其拉', '白起', '不知火舞',
'妲己', '狄仁杰', '典韋', '韓信', '老夫子', '劉邦', '干將莫邪', '劉禪', '魯班七號', '墨子', '孫臏', '孫尚香',
'孫悟空', '項羽', '亞瑟',
'周瑜', '莊周', '蔡文姬', '甄姬', '廉頗', '程咬金', '后羿', '扁鵲', '大喬', '鐘無艷', '小喬', '王昭君', '虞姬',
'李元芳', '張飛', '劉備',
'牛魔張良', '蘭陵王', '露娜', '貂蟬', '達摩', '曹操', '羋月', '荊軻', '高漸離', '鐘馗', '花木蘭', '關羽',
'李白', '宮本武藏', '呂布',
'嬴政', '娜可露露', '武則天', '趙云', '姜子牙','戈亞','海月']
@app.route("/index")
def index():
return render_template('index.html', hero=hero)
@app.route("/choujiang")
def choujiang():
num = randint(0,len(hero)-1)
return render_template('index.html',hero=hero,h = hero[num])
app.run(debug=True)
// flask/templates/index.html ,這里可以自己利用去美化前端頁面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ hero1 }}<br/><br/><br/>
<a href="/choujiang">隨機抽取</a></br></h1>
<h1>你抽到的英雄是 : {{ h }}</h1>
</body>
</html>
7.實現效果

8.正則技巧
我這里使用的是sublime中的正則轉換

寫正則

轉換后效果

參考文章: //建議讀一下
什么是框架(https://zhuanlan.zhihu.com/p/114189046)
python flask框架(https://blog.csdn.net/qq_39838607/article/details/119563692)
本文來自博客園,作者:Liberty碼農志,轉載請注明原文鏈接:http://www.rzrgm.cn/zhiliu/p/16851293.html

浙公網安備 33010602011771號