【python】Flask視圖

2.1 從 Hello World 開始

Flask程序運行過程:

所有Flask程序必須有一個程序實例。

Flask調用視圖函數后,會將視圖函數的返回值作為響應的內容,返回給客戶端。一般情況下,響應內容主要是字符串和狀態碼。

當客戶端想要獲取資源時,一般會通過瀏覽器發起HTTP請求。此時,Web服務器使用WSGI(Web Server Gateway Interface)協議,把來自客戶端的所有請求都交給Flask程序實例。WSGI是為 Python 語言定義的Web服務器和Web應用程序之間的一種簡單而通用的接口,它封裝了接受HTTP請求、解析HTTP請求、發送HTTP,響應等等的這些底層的代碼和操作,使開發者可以高效的編寫Web應用。

程序實例使用Werkzeug來做路由分發(URL請求和視圖函數之間的對應關系)。根據每個URL請求,找到具體的視圖函數。 在Flask程序中,路由的實現一般是通過程序實例的route裝飾器實現。route裝飾器內部會調用add_url_route()方法實現路由注冊。

調用視圖函數,獲取響應數據后,把數據傳入HTML模板文件中,模板引擎負責渲染響應數據,然后由Flask返回響應數據給瀏覽器,最后瀏覽器處理返回的結果顯示給客戶端。

示例:

新建文件hello.py:

# 導入Flask類
from flask import Flask#Flask類接收一個參數__name__
app = Flask(__name__)# 裝飾器的作用是將路由映射到視圖函數index
@app.route('/')
def index():return 'Hello World'# Flask應用程序實例的run方法啟動WEB服務器
if __name__ == '__main__':app.run()

查看視圖函數中的路由:

?

給路由傳參示例:

有時我們需要將同一類URL映射到同一個視圖函數處理,比如:使用同一個視圖函數 來顯示不同用戶的個人信息。

# 路由傳遞的參數默認當做string處理,這里指定int,尖括號中冒號后面的內容是動態的
@app.route('/user/<int:id>')
def hello_itcast(id):return 'hello itcast %d' %id

?

返回狀態碼示例:

return后面可以自主定義狀態碼(即使這個狀態碼不存在)。當客戶端的請求已經處理完成,由視圖函數決定返回給客戶端一個狀態碼,告知客戶端這次請求的處理結果。

@app.route('/')
def hello_itcast():return 'hello itcast',999

?

abort函數:

如果在視圖函數執行過程中,出現了異常錯誤,我們可以使用abort函數立即終止視圖函數的執行。通過abort函數,可以向前端返回一個http標準中存在的錯誤狀態碼,表示出現的錯誤信息。

使用abort拋出一個http標準中不存在的自定義的狀態碼,沒有實際意義。如果abort函數被觸發,其后面的語句將不會執行。其類似于python中raise。

from flask import Flask,abort
@app.route('/')
def hello_itcast():abort(404)return 'hello itcast',999

捕獲異常:

在Flask中通過裝飾器來實現捕獲異常,errorhandler()接收的參數為異常狀態碼。視圖函數的參數,返回的是錯誤信息。


@app.errorhandler(404)
def error(e):return '您請求的頁面不存在了,請確認后再次訪問!%s'%e

?

重定向redirect示例

from flask import redirect
@app.route('/')
def hello_itcast():return redirect('http://www.itcast.cn')

?

正則URL示例:

正則URL是為了匹配指定的URL,而匹配指定的URL則可以達到限制訪問,以及優化訪問路徑的目的。

from flask import Flask
from werkzeug.routing import BaseConverterclass Regex_url(BaseConverter):def __init__(self,url_map,*args):super(Regex_url,self).__init__(url_map)self.regex = args[0]app = Flask(__name__)
app.url_map.converters['re'] = Regex_url@app.route('/user/<re("[a-z]{3}"):id>')
def hello_itcast(id):return 'hello %s' %id

設置cookie和獲取cookie


from flask import Flask,make_response
@app.route('/cookie')
def set_cookie():resp = make_response('this is to set cookie')resp.set_cookie('username', 'itcast')return resp
from flask import Flask,request
#獲取cookie
@app.route('/request')
def resp_cookie():resp = request.cookies.get('username')return resp

2.2 擴展

上下文:相當于一個容器,保存了Flask程序運行過程中的一些信息。

Flask中有兩種上下文,請求上下文和應用上下文。

請求上下文(request context)

request和session都屬于請求上下文對象。

request:封裝了HTTP請求的內容,針對的是http請求。舉例:user = request.args.get('user'),獲取的是get請求的參數。

session:用來記錄請求會話中的信息,針對的是用戶信息。舉例:session['name'] = user.id,可以記錄用戶信息。還可以通過session.get('name')獲取用戶信息。

應用上下文(application context)

current_app和g都屬于應用上下文對象。

current_app:表示當前運行程序文件的程序實例。我們可以通過current_app.name打印出當前應用程序實例的名字。

?

g:處理請求時,用于臨時存儲的對象,每次請求都會重設這個變量。比如:我們可以獲取一些臨時請求的用戶信息。

  • 當調用app = Flask(_name_)的時候,創建了程序應用對象app;
  • request 在每次http請求發生時,WSGI server調用Flask.call();然后在Flask內部創建的request對象;
  • app的生命周期大于request和g,一個app存活期間,可能發生多次http請求,所以就會有多個request和g。
  • 最終傳入視圖函數,通過return、redirect或render_template生成response對象,返回給客戶端。

區別:?請求上下文:保存了客戶端和服務器交互的數據。 應用上下文:在flask程序運行過程中,保存的一些配置信息,比如程序文件名、數據庫的連接、用戶信息等。

請求鉤子

在客戶端和服務器交互的過程中,有些準備工作或掃尾工作需要處理,比如:在請求開始時,建立數據庫連接;在請求結束時,指定數據的交互格式。為了讓每個視圖函數避免編寫重復功能的代碼,Flask提供了通用設施的功能,即請求鉤子。

請求鉤子是通過裝飾器的形式實現,Flask支持如下四種請求鉤子:

before_first_request:在處理第一個請求前運行。

before_request:在每次請求前運行。

after_request:如果沒有未處理的異常拋出,在每次請求后運行。

teardown_request:在每次請求后運行,即使有未處理的異常拋出。

Flask裝飾器路由的實現:

Flask有兩大核心:Werkzeug和Jinja2。Werkzeug實現路由、調試和Web服務器網關接口。Jinja2實現了模板。

Werkzeug是一個遵循WSGI協議的python函數庫。其內部實現了很多Web框架底層的東西,比如request和response對象;與WSGI規范的兼容;支持Unicode;支持基本的會話管理和簽名Cookie;集成URL請求路由等。

Werkzeug庫的routing模塊負責實現URL解析。不同的URL對應不同的視圖函數,routing模塊會對請求信息的URL進行解析,匹配到URL對應的視圖函數,以此生成一個響應信息。

routing模塊內部有Rule類(用來構造不同的URL模式的對象)、Map類(存儲所有的URL規則)、MapAdapter類(負責具體URL匹配的工作);

Flask-Script擴展命令行

通過使用Flask-Script擴展,我們可以在Flask服務器啟動的時候,通過命令行的方式傳入參數。而不僅僅通過app.run()方法中傳參,比如我們可以通過python hello.py runserver --host ip地址,告訴服務器在哪個網絡接口監聽來自客戶端的連接。默認情況下,服務器只監聽來自服務器所在計算機發起的連接,即localhost連接。

我們可以通過python hello.py runserver --help來查看參數。

from flask import Flask
from flask_script import Managerapp = Flask(__name__)manager = Manager(app)@app.route('/')
def index():return '床前明月光'if __name__ == "__main__":manager.run()

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456621.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456621.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456621.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大數據之Kafka入門簡介

目錄前言&#xff1a;1、Kafka是什么2、JMS是什么3、Kafka核心組件&#xff08;重點&#xff09;總結&#xff1a; 目錄 前言&#xff1a; 作為流式計算中的一個組件&#xff0c;對于它的組成以及運行的原理&#xff0c;學習者也需要相關的了解。以下主要簡單介紹了kafka是什…

oracle的安裝與plsql的環境配置

1&#xff0c;首先得有oracle的安裝包和plsql的安裝包&#xff0c;安裝包地址可見百度云 http://pan.baidu.com/s/1miTqhmg 2.解壓下來進入0817賬套&#xff0c;找到set.exe文件&#xff0c;雙擊安裝即可 注意的是安裝的時候有兩個目錄是要自己創建的&#xff0c;否則安裝不成功…

如何在Docker容器中運行GUI程序

如何在Docker容器中運行GUI程序 各位&#xff0c;今天我們將學習如何在Docker之中運行GUI程序。我們可以輕易地在Docker容器中運行大多數GUI程序且不出錯。Docker是一個開源項目&#xff0c;提供了一個打包、分發和運行任意程序的輕量級容器的開放平臺。它沒有語言支持、框架或…

【python】Get與Post的區別?(面試官最想聽到的答案)

GET和POST是HTTP請求的兩種基本方法&#xff0c;要說它們的區別&#xff0c;接觸過WEB開發的人都能說出一二。 最直觀的區別就是GET把參數包含在URL中&#xff0c;POST通過request body傳遞參數。 你可能自己寫過無數個GET和POST請求&#xff0c;或者已經看過很多權威網站總結出…

大數據之Kafka集群安裝及簡單使用

目錄1、Kafka集群部署2、Kafka常用操作命令 目錄 1、Kafka集群部署 1.1、下載安裝包 http://kafka.apache.org/downloads.html 在linux中使用wget命令下載安裝包 wget http://mirrors.hust.edu.cn/apache/kafka/0.8.2.2/kafka_2.11-0.8.2.2.tgz 1.2、解壓安裝包 tar -z…

Python爬蟲入門之Urllib庫的基本使用

那么接下來&#xff0c;小伙伴們就一起和我真正邁向我們的爬蟲之路吧。 1.分分鐘扒一個網頁下來 怎樣扒網頁呢&#xff1f;其實就是根據URL來獲取它的網頁信息&#xff0c;雖然我們在瀏覽器中看到的是一幅幅優美的畫面&#xff0c;但是其實是由瀏覽器解釋才呈現出來的&#xf…

【python】hashlib.shasha256練習注冊 --筆記

用戶注冊和登錄import csv import hashlib#注冊將用戶信息填寫到csv文件中 def register():username input(用戶名:)password input(密碼:)user []user.append(username)user.append(hashlib.sha256(password.encode(utf-8)).hexdigest())with open(t2/users.csv, a, newlin…

《3ds Max瘋狂設計學院》——1.6節3ds Max 2016新增的主要功能

本節書摘來自異步社區《3ds Max瘋狂設計學院》一書中的第1章&#xff0c;第1.6節3ds Max 2016新增的主要功能&#xff0c;作者 曹茂鵬&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看 1.6 3ds Max 2016新增的主要功能1&#xff0e;Max Creation Graph3ds Max…

大數據之Kafka內部原理詳細介紹

目錄前言&#xff1a;1、Kafka整體結構2、Consumer與topic關系3、Kafka消息的分發4、Consumer的負載均衡5、kafka文件存儲機制總結&#xff1a; 目錄 前言&#xff1a; 本篇文章所介紹的內容還是以了解為主&#xff0c;主要目的還是為了對Kafka有一個更深入的理解。主要介紹…

【python】urllib和urllib3,requests 簡要概括---筆記

urllib和urllib3&#xff0c;requestsurl:協議://存放資源的地址&#xff08;域名&#xff09;/具體的資源https://bj.lianjia.com/zufang/dghfjhsjdf648.htmlurllib.request 用來發出請求urllib.parseurllib.request.urlopen(str) --->response對象request urllib.reques…

JS與APP原生控件交互

“熱更新”、“熱部署”相信對于混合式開發的童鞋一定不陌生&#xff0c;那么APP怎么避免每次升級都要在APP應用商店發布呢&#xff1f;這里就用到了混合式開發的概念&#xff0c;對于電商網站尤其顯得重要&#xff0c;不可能每次發布一個活動&#xff0c;都要發布一個現版本&a…

《脫穎而出——成功網店經營之道》一2.6 連橫:返利模式的應用及分銷

本節書摘來異步社區《脫穎而出——成功網店經營之道》一書中的第2章&#xff0c;第2.6節&#xff0c;作者&#xff1a; 何小健 責編&#xff1a; 趙軒, 更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.6 連橫&#xff1a;返利模式的應用及分銷 脫穎而出——成功網店…

【python】os模塊 遞歸刪除文件夾所有文件 --筆記

os.environ 獲取系統的環境變量 os.name nt -- windows \r\n | posix --- Linux \nos.path: import osprint(os.environ) print(os.environ[OS])print(os.path.abspath(t1/file01.py)) # 獲取絕對路徑 print(os.path.isabs(t1/file01.py)) # 判斷所給的路徑是否是一個絕對…

大數據之Spark集群安裝及簡單使用

目錄1、Spark集群安裝1.1. 安裝 2、啟動Spark Shell2.1、啟動spark shell2.2、在spark shell中編寫WordCount程序 目錄 1、Spark集群安裝 1.1. 安裝 1.1.1. 機器部署 準備兩臺以上Linux服務器&#xff0c;安裝好JDK1.7 1.1.2. 下載Spark安裝包 下載地址&#xff1a;ht…

《C和C++代碼精粹》——1.7 類型安全I/O

本節書摘來自異步社區出版社《C和C代碼精粹》一書中的第1章第1.7節&#xff0c;作者&#xff1a; 【美】Chuck Allison&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 1.7 類型安全I/O C和C代碼精粹當然每個C程序員都曾經使用過printf的錯誤格式描述符號。…

大數據之Spark簡介及RDD說明

目錄前言&#xff1a;1、Spark概述1.1、什么是Spark&#xff08;官網&#xff1a;http://spark.apache.org&#xff09;1.2、為什么要學Spark1.3、Spark特點 2、RDD概述2.1、什么是RDD2.2、RDD的屬性2.3、創建RDD的兩種方式2.4、RDD編程API2.5、RDD的依賴關系2.6、RDD的緩存2.7…

Python3中urlopen()詳解

一. 簡介 urllib.request.urlopen()函數用于實現對目標url的訪問。 函數原型如下&#xff1a;urllib.request.urlopen(url, dataNone, [timeout, ]*, cafileNone, capathNone, cadefaultFalse, contextNone)  url: 需要打開的網址 data&#xff1a;Post提交的數據 timeo…

python面向對象實現簡易銀行管理員頁面系統

銀行管理員頁面系統設計:card 類&#xff1a; cardId password moneyuser 類: username phone id cards[]銀行的工作人員: 賬號 密碼 登錄 展現管理系統所有功能Bank類:開戶取錢存錢轉賬銷戶查賬解鎖... import pickle import random# 銀行卡 import time#card 類…

單子模式

package test; class aceing { /** param args */ private static aceing ace; public aceing() { super(); System.out.println("aceing類中的無參構造器調用了"); } public static aceing getAceing() { if(ace null) { ace new aceing(); } return ace; }} pack…

《塑造互聯網思維的企業》一一第4章 全球商務向社會化媒體的轉變

第4章 全球商務向社會化媒體的轉變 塑造互聯網思維的企業社會化媒體在發達國家的廣泛采用已是我們所熟知的&#xff0c;它在社會和全球文化產生的大范圍變革中至關重要。為了完全了解其中的原因&#xff0c;有必要探究一下那些推動社會化商務的復雜且相互關聯的因素的共同影響…