Flask視圖和URL

Flask視圖和URL

1-虛擬環境

到目前位置,我們所有的第三方包安裝都是通過pip install xxx的方式進行安裝的,這樣安裝會將那個包安裝到你的系統級的Python環境中。但是這樣有應該問題,就是如果你現在用Django 1.10.x寫了個網站,然後你的領導跟你說,之前有一箇舊項目是用Django 0.9開發的,讓你來維護,但是Django 1.10不再兼容Django 0.9的一些語法了。這時候就會碰到一個問題,我如何在我的電腦中同時擁有Django 1.10和Django 0.9兩套環境呢?這時候我們就可以通過虛擬環境來解決這個問題。

Windows安裝pipenv:pip install pipenv

Mac安裝:brew install pipenv

Linux安裝:pip install pipenv

pipfile和pipfile.lock

Pipfile文件:

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
flask = "*"

[requires]
python_version = "3.6"

url:  # 指國內pip源,不然庫會下載很慢
[dev-packages]: # 開發環境
packages:      # 生產環境
flask = '*' 	#  '*'號代表使用的是最新版本
[requires] 		# 代表使用的Python版本

pipfile.lock,詳細記錄環境依賴,並且利用Hash算法保證了它完整對應關係

如果需要指定Python版本的話,前提是電腦中已經安裝Python2和Python3

pipenv --three 	# 泛指Python3的版本
pipenv -- two   # 泛指Python2的版本
pipenv --python 3.7 # 指定Python版本

進入/退出/刪除環境環境

pipenv shell	# 進入虛擬環境
exit			# 退出虛擬環境
pipenv --rm 	# 刪除整個環境 不會刪除pipfile

管理開發環境

安裝在開發環境下

pipenv install --dev itchat

在虛擬環境中安裝包

pienv install 包名

在虛擬環境中允許命令,適應run參數

pipenv run Python manage.py runsever

2-Flask簡介

flask是一款非常流行的Python Web框架,出生於2010年,作者是Armin Ronacher,本來這個項目只是作者在愚人節的一個玩笑,後來由於非常受歡迎,進而成爲一個正式的項目。flask自2010年發佈第一個版本以來,大受歡迎,深得開發者的喜愛,並且在多個公司已經得到了應用,flask能如此流行的原因,可以分爲以下幾點:

• 微框架、簡潔、只做他需要做的,給開發者提供了很大的擴展性。
• Flask和相應的插件寫得很好,用起來很爽。
• 開發效率非常高,比如使用SQLAlchemy的ORM操作數據庫可以節省開發者大量書寫sql的時間
Flask的靈活度非常之高,他不會幫你做太多的決策,一些你都可以按照自己的意願進行更改。
• 使用Flask開發數據庫的時候,具體是使用SQLAlchemy還是MongoEngine,選擇權完全掌握在你自己的手中。區別於Django,Django內置了非常完善和豐富的功能,並且如果你想替換成你自己想要的,要麼不支持,要麼非常麻煩。
• 把默認的Jinija2模板引擎替換成其他模板引擎都是非常容易的。

第一個flask程序

from flask import Flask

app = Flask(__name__)

# app.route是一個裝飾器,裝飾器映射URL和執行的函數。這個設置將根URL映射到hello_world函數上
@app.route('/')
def hello_world():

return 'Hello World!'

if __name__ == '__main__':
# 運行本項目
app.run()

3-項目配置

設置DEBUG模式

默認情況下flask不會開啓DEBUG模式,開啓DEBUG模式後,flask會在每次保存代碼的時候自動的重新載入代碼,並且如果代碼有錯誤,會在終端進行提示

開啓DEBUG模式的三種方法

1.直接在應用對象設置
app.debug = True
app.run()

2.在執行run方法的時候,傳遞參數進去
app.run(debug=True)

3.在config屬性中設置
app.config.update(DEBUG=True)

如果正常會顯示如下:

 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 110-221-148
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

4-URL與視圖

1 -URL與函數的映射

從之前的helloword.py文件中,我們已經看到,一個URL要與執行函數進行映射,使用的是@app.route裝飾器。
@app.route裝飾器中,可以指定URL的規則來進行更加詳細的映射,比如現在要映射一個文章詳情的URL,文章詳情的URL是/article/id/,id有可能爲1、2、3等,那麼可以通過以下方式

from flask import Flask

app = Flask(__name__)

# 裝飾器路徑
@app.route('/')		
def hello_world():
    return 'Hello World!'

@app.route('/demo')
def demo():
    return 'demo'

# 指定路徑爲整型。
@app.route('/demo/<int:aid>/')
def article_list(aid):
    return '這是我的第{}文章'.format(aid)

# 指定路徑爲浮點型
@app.route('/demo/<float:aid>/')
def demo1(aid):
    return '這是{}浮點型文章'.format(aid)

# 可以傳遞有/的斜槓
@app.route('/demo/<path:aid>/')
def article(aid):
    return '這是article的第{}文章'.format(aid)


if __name__ == '__main__':
	# app.config.update(DEBUG=True)
	# app.debug = True
	# app.run(debug=True)
	app.run()

其中,尖括號是固定寫法,語法爲,variable默認的數據類型是字符串。如果需要指定類型,則要寫成converter:variable,其中converter就是類型名稱,可以有以下幾種:

  • string: 默認的數據類型,接受沒有任何斜槓/的字符串
  • int: 整型
  • float: 浮點型
  • path: 和string類似,但是可以傳遞斜槓/
  • uuid: uuid類型的字符串
  • any: 可以指定多種路徑

如果不想定製子路徑來傳遞參數,也可以通過傳統的?=的形式來傳遞參數,例如:/article?id=xxx,這種情況下,可以通過requests.args.get('id')來獲取id的值。如果是post方法,則可以通過requests.from.get(‘id’)來進行獲取。

2-構造URL(url_for)

一般我們通過一個URL就可以執行到某一個函數。如果反過來,我們知道一個函數,怎麼去獲取的這個URL呢?url_for函數就可以幫我們實現這個功能。url_for()函數接收兩個即以上的參數,它接收函數名作爲第一個參數,接收對應URL規則的命名參數,如果還出現其他的參數,則會添加到URL的後面作爲查詢參數

通過構建URL的方式而選擇直接在代碼中拼URL的原因有兩點

  • 將來如果修改了URL,但沒有修改該URL對應的函數名,就不用到處去替換URL了。
  • url_for()函數會轉義一些特殊字符和uniconde字符串,着些事情url_for會自動的幫我們搞定
# -*- coding: utf-8 -*- 
# @Time : 2020/4/9 11:20 
# @Author : 大數據小J

from flask import Flask, url_for

app = Flask(__name__)


# 裝飾器路由
@app.route('/')
def hello_world():
    return 'hello world'


@app.route('/article/<int:aid>/')
def article(aid):
    # 打印該函數的路由設置
    print(url_for('hello_world'))   # /
    # 當函數中有參數的時候,要設置該函數的參數值,當做路由返回
    # 當函數中的參數沒有該參數值的時候,路由會將該參數用一個問號連接起來,當一個get請求
    # 根據指定的函數名字進行反轉,得到函數相對應的路由  重定向
    print(url_for('article', aid=10, page=15))
    return '這是文章第{}頁'.format(aid)


if __name__ == '__main__':
    app.debug = True
    app.run()

3-指定URL末尾的斜槓

有些URL的末尾是有斜槓的,有些URL末尾是沒有斜杆的。

這其實是兩種不同的URL

@app.route('/article/')
def articles():
    return '文章列表頁'

上訴例子中,當訪問一個結尾不帶斜線的URL:/article,會被重定向到帶斜線的URL:/article/上去。但是當我們在定義article的URL的時候,如果在末尾沒有加上斜槓,但是在訪問的時候又加上了斜槓,這時候就會拋出一個404錯誤頁面

@app.route("/article")
def articles(request):
    return "文章列表頁面"

以上沒有在末尾加斜杆,因此在訪問/article/的時候,就會拋出一個404錯誤。

4-指定HTTP方法

在app.rount(’/’)中可以傳入一個關鍵字methods指定本方法支持的HTTP方法,默認情況下,只能使用GET請求

GET請求寫法:

request.args.get('接收的key值')

POST請求寫法:

request.form.get('接收的key值')

# -*- coding: utf-8 -*- 
# @Time : 2020/4/9 11:34 
# @Author : 大數據小J

from flask import Flask, request

app = Flask(__name__)


# 默認情況下發送get請求,當要發送其他請求的時候,需要加上methods
@app.route('/login/', methods=['get', 'post'])
def login():
    # get發送請求接受數據
    get_data = request.args.get('name')
    # print(get_data)
    # post發送請求接受數據
    post_data = request.form.get('class')
    # print(request.form.get('age'))
    print(post_data)
    return 'login'


if __name__ == '__main__':
    app.run(debug=True)

5-頁面跳轉和重定向

重定向分爲永久性重定向和暫時性重定向,在頁面上體現的操作就是瀏覽器會從一個頁面自動跳轉到另外一個頁面。比如永華訪問一個需要權限的頁面,但是該用戶當前並沒有登錄,因此我們應該給他重定向到登錄頁面

  • 永久性重定向:http的狀態碼是301,多用於舊網址被廢棄要轉到一個新的網站確保用戶的訪問。
  • 暫時性重定向:http的轉檯碼是302,表示頁面的暫時性跳轉。比如防衛一個需要權限的網址,如果當前用戶沒有登錄,應該重定向到登錄頁面,這種情況下,應該用暫時性重定向

在Flask中,重定向是通過flask.redirect('location',code=302)這個函數來實現的,location表示需要重定向到的URL,應該配合之前使用過的url_for()函數來使用,code表示採用哪個重定向,默認是302也即暫時重定向,可以修改成301來實現用永久重定向

# -*- coding: utf-8 -*- 
# @Time : 2020/4/9 13:30 
# @Author : 大數據小J

import flask

app = flask.Flask(__name__)


@app.route('/')
def hello_world():
    return 'hello world'


# 登錄界面
@app.route('/login/')
def login():
    return '這是我的登錄界面'


# 這個是請求登錄界面
@app.route('/sign_in/')
def sign_in():
    name = flask.request.args.get('name')
    if name:
        return name
    else:
        # redirect爲重定向的一個方法,code爲重定向端口號
        return flask.redirect(flask.url_for('login'), code=302)


if __name__ == '__main__':
    app.run(debug=True)

當訪問sign_in這個頁面的時候,當沒有name值的時候,會使用redirecr這個方法進行永久重定向跳轉

在這裏插入圖片描述

當傳入name值的時候,會返回name對應的value值

在這裏插入圖片描述

5-關於響應(response)

視圖函數中可以返回以下類型的值:

  • Response對象

  • 字符串。其實Flask是根據返回的字符串類型,重新創建應該werkzeug.wrappers.Response對象,Response將該字符串作爲主體,狀態碼爲200,MIME類型爲text/html然後返回該Response對象。

  • 元組。元組中格式是(response, status, headers)response爲一個字符串,status值是狀態碼,headers是一些響應頭。

  • 如果表示以上三種類型。那麼Flask會通過Response.force_type(rv,request.environ)轉換一個請求對象。

# -*- coding: utf-8 -*- 
# @Time : 2020/4/9 14:56 
# @Author : 大數據小J
from flask import Flask, Response, make_response

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'hello_world'


# 返回的數據類型可以爲字符串,字典,元組(元組默認返回下標爲0的元組)
@app.route('/about/')
def about():
    # return '關於我們'
    # return {'name': 'SmallJ'}
    # return ('Python', 'Java')
    # start爲狀態碼,content_type爲內容類型,charset爲指定類型
    # return Response('關於我們', status=200, content_type='text/html;charset=utf-8')
    return make_response('關於我們')


if __name__ == '__main__':
    app.run(debug=True)		
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章