flask用法詳解⚡基礎篇|Python 主題月

本文正在參加「Python主題月」,詳情查看 活動連接html

導讀

今天接着爲暑假的項目作準備,最近一直作python類的總結因此咱們的項目就從python開始吧,喜歡java的同窗也不要氣餒,後面也會相應的寫一個java類的項目喜歡的同窗能夠關注一波,暑假跟着敲一敲,也能夠先收藏一波等有空的時候拿來練手,好了咱們進入正題,喊出口號「==不肥身體,肥學問==」java

強調:文章中的內容有不理解或者有毛病的能夠留言哦,另外說一下我這只是一篇基礎的介紹建議你們仍是看看我文章末尾發的資源能夠詳細瞭解一下。python

爲何用flask

在這裏插入圖片描述

FLask框架自己只實現了最基本的功能,因此FLask被稱爲 microFramework(微框架),從代碼量上來看,的確如此。可是從工程上來看,這種所謂的「小」,反而帶來了更多的便利性。在大型項目裏,flaskdjango方便太多。大型的意思是你要自定義admin系統(好比管理員分層,每一個管理員都能自定義管理組),複雜的數據庫操做,許多許多的跨entity的表單操做及驗證等。mysql

豐富的第三方庫資源,讓你在編寫幾乎任何類型的程序時都能如魚得水。操做數據庫用FLask-SQLAlchemy,驗證表單用Flask-WTF,登陸管理用FLask-Login,郵件用Flask-Mail... 因此,Flask和兄弟框架Django比起來,另外一個有點就很明顯了:靈活。你能夠任意選擇喜歡的第三方擴展web

安裝flask

pip install flask
複製代碼

可是這樣安裝的話有點點慢的,仍是建議轉戰清華源,或者豆瓣源這些鏡像正則表達式

pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple 
複製代碼

另外還須要提一點的是咱們最好在寫項目的時候建工程==使用虛擬環境==這樣能夠預防一些python包的衝突,另外對於不怎麼會創建虛擬環境的同窗我會在下面推薦一本書,裏面會有詳細的教程。sql

啓動flask

from flask import Flask

app=Flask(__name__)#建立一個實例這樣 下面有專門講這個的

@app.route('/') #.route的做用時從實例這裏建立路由告訴 Flask 什麼樣的URL 能觸發咱們的函數
def hello(): #簡單的建立一個函數
    return '你好'

if __name__=='__main__':
    app.run(debug=True)# .run是flask開始運行的語句,裏面也有不少參數通常建議使用debug=True,自帶的調試總比你本身要好一點
    app.run(host='192.168.1.2',port=3308)# 可加可不加這是對具體host和端口的設置,取決你的默認端口是否被佔用
複製代碼

詳情看調試器操做:傳送門 在這裏插入圖片描述數據庫

flask裏name的用處

從上面的程序裏面咱們能夠看出flask裏面有個name這個是爲了啓動模板專門設立的若是你使用單一的模塊(如上例),你應該使用 name ,由於模塊的名稱將會因其做爲單獨應用啓動仍是做爲模塊導入而有不一樣( 也便是 'main' 或實際的導入名)。這是必須的,這樣 Flask 才知道到哪去找模板、靜態文件等等,另外還有:django

static_folder:靜態地址,默認爲static文件夾
複製代碼
static_url_path:靜態網頁地址
複製代碼
template_folder:模板文件夾,默認爲templates文件夾
複製代碼

若是這裏有點點不理解不要緊,最後送的書裏面會給詳細的解釋,讓你能本身動手開發項目。也能夠先看一下官方文檔傳送門json

轉換器和變量規則

要給 URL 添加變量部分,你能夠把這些特殊的字段標記爲 <variable_name> , 這個部分將會做爲命名參數傳遞到你的函數。規則能夠用 <converter:variable_name> 指定一個可選的轉換器,轉換器主要是將頁面後的值做爲某一個標準來獲得另外一個頁面,咱們常看到的加密字符串就是用這個作

from flask import Flask
 
app = Flask(__name__)
 
 
@app.route('/user/<username>')#定義轉換器
def show_user_profile(username):#將轉換器傳入函數中
    # show the user profile for that user
    return 'User %s' % username
 
 
@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id
 
 
if __name__ == '__main__':
    app.run()
複製代碼
Flask的默認轉換器:DEFAULT_CONVERTERS = {
‘default’: UnicodeConverter,
‘string’: UnicodeConverter,
‘any’: AnyConverter,
‘path’: PathConverter,
‘int’: IntegerConverter,
‘float’: FloatConverter,
‘uuid’: UUIDConverter,}
複製代碼

下面展現本身定義轉換器的方法

class rc(BaseConverter):      
 # 重寫父類的屬性,定義轉換器規則
    def __init__(self,url_map):
        super(rc,self).__init__(url_map)
        #驗證QQ郵箱的正則表達式
        self.regex ='[0-9a-zA-Z_]{0,19}@qq.com'
    #定義視圖函數下的返回值
    def to_python(self,value):
        val=value
        return val
    def to_url(self,value):#返回url
        return value
app.url_map.converters['em'] = rc #將自定義的轉換器添加到轉換器列表中
@app.route('/emm/<em:email>') #加入新的轉換器
def email(email):
    return 'email is:%s' % email #返回email
複製代碼

重定向

重定向在web開發也挺重要的,它能夠從一個網頁跳到另外一個網頁,至關於刷新以後的操做,對flask而言主要涉及兩個模塊(redirect,url_for) 先創建一個路由用做後面講例子

@app.route('/1')
def fg():
    return '1122'
複製代碼
from flask import redirect,url_for
@app.route('/refer')
def refer():
    return redirect('/1')#建立的另一個路由
複製代碼

這樣就能夠直接跳轉到路由(‘/1’)中的函數中並顯示返回值。 咱們能夠先訪問路由函數,而後跳轉到相應內容頁面這種方式稱爲間接跳轉

@app.route('/ref')
def ref():
    return redirect(url_for('fg')) #跳轉這樣直接訪問ref子頁面就能夠直接跳轉到相應頁面了
複製代碼

設置錯誤頁面

你們都知道網頁加載避免不了404 等一些錯誤的,flask有兩種方式,一是使用系統的abort直接賦值,二是使用自定義errorhandler函數

  • 使用abort()你能夠用 redirect() 函數把用戶重定向到其它地方。放棄請求並返回錯誤代碼,用 abort() 函數。這裏是一個它們如何使用的例子:
from flask import abort, redirect, url_for
 
@app.route('/')
def index():
    return redirect(url_for('login'))
 
@app.route('/login')
def login():
    abort(401)#401 意味着禁止訪問
    this_is_never_executed()
複製代碼
  • 默認狀況下,錯誤代碼會顯示一個黑白的錯誤頁面。若是你要定製錯誤頁面, 可使用 errorhandler() 裝飾器:
from flask import render_template
 
@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404
複製代碼

注意 render_template() 調用以後的 404 。這告訴 Flask,該頁的錯誤代碼是 404 ,即沒有找到。默認爲 200,也就是一切正常。

json數據讀取

json做爲通用的數據傳輸格式其實用性仍是比較高的,flask做爲web框架對它固然也有必定的處理能力,目前是使用jsonify

@app.route('/json1')
def json1():
    data={'name':'HW','first':'ZJ'}
    return jsonify(data)


@app.route('/json2')
def json2():
    return jsonify(hour=12,second=21)
複製代碼

在這裏插入圖片描述

cookie和session

session裏面保留的就是會話內容,它存在於cookie當中,經過它咱們能夠直接登錄某些已經登錄過的系統。要想操做session咱們須要引入爲它專門準備的session模塊,還有須要配置安全祕鑰纔可使用session 先來講一下cookie的操做

cookie的設置
set_cookie(key, value='', max_age=None, expires=None,path='/', domain=None, secure=False, httponly=False,samesite=None)

key:鍵
value:值
max_age:設置過時時間(秒)
expires:設置過時時間,時間戳的形式(1970離如今的時間)
path:當前主域名
domain:子域名
複製代碼
#設置cookie和headers
@app.route('/set_cookie')
def set_cookie():
    response=make_response('cookie設置成功')
    #cookie有效時長30天也能夠是hour second minute
    time=datetime.datetime.today()+datetime.timedelta(days=30)#設置cookie的有效時長
    response.set_cookie('user','admin',expires=time) #設置用戶名的cookie
    response.set_cookie('pass','123456',expires=time) #設置密碼的cookie
    response.headers['X-Something']='mything' #這裏不容許出現中文
    response.headers['Server']='feixue' #服務器名稱
    return response
複製代碼

在這裏插入圖片描述

對cookie的獲取和刪除

獲取cookie須要加request模塊可不是爬蟲的requests

@app.route('/get_cookie')
def get_cookie():
    name="用戶名:"+request.cookies.get('user')+"密碼:"+request.cookies.get('pass')
    return name
複製代碼

在這裏插入圖片描述 刪除cookie有兩種方式 1·經過設置經過設置cookie過時時間爲0便可刪除

@app.route('/del_cookie1')
def del_cookie1():
    response=make_response('delete cookie 1')
    response.set_cookie('user','',expires=0)
    response.set_cookie('pass','',expires=0)
    return response
複製代碼

2.直接刪除cookie

@app.route('/del_cookie2')
def del_cookie2():
    response=make_response('delete cookie 2')
    response.delete_cookie('user')
    response.delete_cookie('pass')
    return response
複製代碼

使用基於 cookie 的會話需注意: Flask 會將你放進會話對象的值序列化至 Cookies。若是你發現某些值在請求之間並無持久存在,然而確實已經啓用了 Cookies,但也沒有獲得明確的錯誤信息。這時,請檢查你的頁面響應中的 Cookies 的大小,並與 Web 瀏覽器所支持的大小對比。

session操做

設置session 配置安全密鑰 隨機的問題在於很難判斷什麼是真隨機。一個密鑰應該足夠隨機。你的操做系統能夠基於一個密鑰隨機生成器來生成漂亮的隨機值,這個值能夠用來作密鑰:

app.config['SECRET_KEY']=os.urandom(30)
複製代碼

設置session字典

session['user']='fei'
session['pass']='xue'
複製代碼

設置session過時方式

session.parmanent=True #默認31天后過時
#session兩個小時過時
app.config['PERMANENT_SESSION_LIFETIME']= timedelta(hour=2)
複製代碼

合起來就是

@app.route('/session1')
def session1():
    session['user']='fei'
    session['pass']='xue'
    session.parmanent=True #默認31天后過時
    return 'login success'
複製代碼

獲取session get()獲取和索引獲取,索引獲取不太穩定仍是建議用get方法

@app.route('/session')
def session2():
    us=session.get("user")
    pa=session.get("pass")
    return 'hello %s %s'%(us,pa)
複製代碼

刪除session 逐一刪除

@app.route('/session')
def session3():
    session.pop('user',None)
    session.pop('pass',None)
    return 'delete successful!'
複製代碼

全刪

@app.route('/session4')
def session4():
    session.clear()
    return 'delete successful!'
複製代碼

request的使用

在上面獲取cookie有提到request,下面咱們來特地講一下關於request的使用這是一個專門用來操做網頁請求的模塊。 requestget請求

可經過設置它的methods參數來指定請求方式。

@app.route('/get', methods = ['GET','POST'])
def get():
    if request.method == 'GET':
        return '這是一個GET請求'
    else:
        return '這是一個其它請求'
複製代碼

post請求

@app.route('/post', methods = ['POST','GET'])
def post():
    if request.method == 'POST':
        return '這是一個POST請求'
    else:
        return '這是一個其它請求'
複製代碼

request的args

記錄get請求中的查詢參數,通常用於查詢,搜索網址

https://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord=你的名字
複製代碼
它會返回get請求中的參數,好比請求上面的url,它的請求參數即是:

searchType=song&searchKeyWord=你的名字
複製代碼
使用方法:

request.args['keyword']
request.args.get('keyword')
複製代碼

requestform 記錄請求中的表單數據,通常用於表單提交。好比咱們註冊網站時常常須要進行表單提交。

咱們可使用獲取表單中的內容:

request.form['keyword']
request.form.get('keyword')
複製代碼

requestheaders

返回請求網頁頭部信息,返回一個列表。

request.headers['keyword']
request.headers.get('keyword')
複製代碼

藍圖開發必備

這個知識一看就會 下面這個程序的存放文件叫fei.py

from flask import Flask
app=Flask(__name__)
@app.route('/kj')
def df():
    return 'hello world'
@app.route('/index')
def lk():
    return 'efhsfj'
複製代碼

因而就有

from flask import Flask,request
from fei import *
@app.route('/')
def login():
    return request.url
if __name__ == '__main__':
    app.run(debug=True)
複製代碼

看出來了吧,就是從主文件調用此文件裏面的功能藍圖的精髓無非就是將多個模塊引入到一個主模塊中使用,至關於咱們本身在寫模塊並把它當到藍圖中供調用。多個藍圖中若是有相同方法可用藍圖視圖函數來區分各自的方法。

視圖

視圖可你們理解的視圖意思差很少,好比mysql數據庫中的視圖,道理其實都是互通的,並不會有太大的差異,只是功能不同罷了。建立視圖的方式也很簡單,都繼承自flask的views類。 類的視圖

from flask.views import View
def ff():
    return 'ok'
class st(View):
    def dispatch_request(self): #必須實現這個方法
        return "任性的90後boy"
# 類視圖經過add_url_rule方法和url作映射
app.add_url_rule(rule='/ff',view_func=st.as_view('tt'))
複製代碼

方法的

from flask.views import MethodView
def gg():
    return 'ok'
class login(MethodView):
    #當客戶端經過get方法進行訪問的時候執行的函數
    def get(self):
        return 'get'
    # 當客戶端經過post方法進行訪問的時候執行的函數
    def post(self):
        email = request.form.get("user")
        password = request.form.get("pass")
        if user== 'gffsadff' and pass== '4fsaferwf':
            return "登陸成功"
        else:
            return "登錄失敗"

# 經過add_url_rule添加類視圖和url的映射,而且在as_view方法中指定該url的名稱,方便url_for函數調用
app.add_url_rule('/gg',view_func=login.as_view('lg'))

複製代碼

資源分享

跟上次MySQL篇同樣爲了讓你們能夠更好的學習,也給你們找了一些資源flask web開發基於python若是你們想學學看的話就到個人主頁找一下資源吧固然也能夠私信我。最後給你們分享一下我最近特別喜歡的圖片,歡迎你們三連支持哦

在這裏插入圖片描述

相關文章
相關標籤/搜索