Flask——1.初識flask微框架

官網:http://python.usyiyi.cn/translate/flask_011_ch/index.html

1. FLASK 概述

Flask是使用python語言編寫的一個輕量級的web框架

內部WSGI實現採用Werkzeug,模板引擎使用Jinja2,使用BSD授權開源

在行業中,Flask也被稱爲microframework(微框架),因爲Flask使用簡單的核心操作,通過extension增加額外的功能,並且Flask沒有默認的數據庫和表單驗證等支持


2. QUICK START

2.1. Installation

Flask的安裝比較簡單,和常規的模塊安裝方式一致,通過python提供的包安裝工具pip或者easy_install都可以正常安裝

pip install flask

2.2. Hello World

安裝完Flask之後,我們通過一個簡單的應用程序來認識什麼是FlaskFlask web項目的開發步驟以及核心組成部分

創建demo01.py,編輯如下內容

from flask import Flask

app = Flask(__name__)

@app.route(“/”)

def hello():

    return “Hello Flask!”

if __name__ == “__main__”:

    app.run()

可以看到,flask使用最簡單的操作代碼,就可以完成一個web項目需要的基本功能了

3.demo案例

3-1.簡單的demo,瞭解falsk基本結構

'''
簡單的flask應用
'''
# 引入需要的模塊
from flask import Flask

# Flask爲核心處理模塊,用來創建一個app應用
app=Flask(__name__)
# 定義視圖處理函數和對應的訪問路由,該函數和路由已經被封裝在app中。
@app.route('/')
def index():
    return '<h1>首頁</h1>'

@app.route('/login')
def login():
    return '<h1>登錄</h1>'

@app.route('/register')
def register():
    return '<h1>註冊</h1>'

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

"""
總結:Django、Tornado和Flask三種框架定義視圖處理函數(類)和路由的區別
Django中定義視圖處理函數和路由:
    視圖處理函數:通過在views.py文件中,通過def關鍵字定義視圖處理函數
    路由:通過在urls.py文件中,urlpatterns=[]定義不同的路由和對應的視圖處理函數

Tornado中定義視圖處理類和路由:
    視圖處理類:通過class 關鍵字定義視圖處理類,繼承自tornado.web.RequestHandler
    訪問路由:通過tornado.web.Application配置路由信息,以元組的形式[(),],另外在此處可以配置其他信息
    
Flask中定義視圖處理函數和訪問路由
    視圖處理函數:通過def 關鍵字定義視圖處理類
    訪問路由:直接在對應的視圖處理函數上方,通過@app.route()定義對應的訪問路由,可攜帶參數
"""

3-2.flask傳參

# 引入需要的模塊
from flask import Flask

# 使用Flask核心處理模塊創建app應用
app = Flask(__name__)


# 定義訪問路由和對應的視圖處理函數

@app.route('/login/<username>')  # 將參數直接通過路由傳遞給後端
def login(username):  # 括號中用來接收參數
    return '接收到參數%s' % username


@app.route('/index/<int:user_id>')  # 傳遞指定類型的參數
def index(user_id):
    return '接收到指定的int類型的參數:[%s]' % user_id


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

"""
總結:

Django中定義路由傳遞參數:
    url('^index/(?P<u_id>\d+)/')
    Django2path('index/<int:u_id>/)  
    
Tornado中定義路由傳遞參數:
    

Flask中定義路由傳遞參數
   @app.route('/index/<int:user_id>') 
"""

3-3.get和post請求方式傳遞參數和接收參數,藉助於postman插件

postman:專門用於8種請求方式的測試的插件。
'''
get方式和post方式接收參數的方法不同,這裏使用了postman(專門測試8中請求方式的插件),進行兩種方式的測試
'''



# 引入需要的模塊
from flask import Flask,request

# 使用Flask核心處理模塊創建一個app應用
app=Flask(__name__)


# 定義訪問路由和視圖處理類
@app.route('/get')
def get_params():
    # requestargs屬性是專門用來接收get參數的
    params=request.args.get('get_params')
    return '接收到get參數:%s'%params

@app.route('/post',methods=['POST']) 
# 默認所有的視圖處理函數只支持get請求,若需要支持其他請求方式,需使用methods屬性,以列表的形式列出
def post_params(): # requestform屬性是專門用來接收post參數的 params=request.form.get('post_params') return '接收到post參數:%s'%paramsif __name__=='__main__': app.run()
"""
不同請求參數的接收>>>
Django中:
    request.GET/POST
Tornado中:
    self.get_query_argument()/get_query_arguments()
    self.get_body_argument()/get_body_arguments()
    self.get_arguement()/get_arguments()
Flask中:
    request.args.get("key")
    request.form.get("key")


不同請求方式的區分>>>
Django中:
    通過request.method == "GET" / "POST"進行視圖函數中不同請求方式的處理區分
    同樣可以通過裝飾器註解方式:@require_POST @require_GET方式指定視圖函數只能接收那種請求方式
Tornado中:
    可以通過直接重寫父類RequestHandler中的get/post/..的請求處理方法來實現不同的請求方式的區分
Flask中:
    通過路由裝飾器註解的methods屬性來指定視圖處理函數可以接收那種請求方式
        @app.route("/", methods=["get", "post"..])
"""
3-4.網頁模板和靜態資源
.py文件
# 引入需要的模塊
from flask import Flask, request, render_template

# 創建app應用
app = Flask(__name__)


@app.route('/index')
def index():
    plist = [{'name': 'jerry'},
             {'name': 'tom'},
             {'name': 'suker'}]
# render_template會自動搜索同級目錄下的templates文件夾找到對應的html文件
    return render_template('index.html', plist=plist)


if __name__ == '__main__':
    app.run()
"""
靜態文件和網頁模板的處理:
Django中:
    子模塊應用:templates/默認保存網頁模板;static/默認保存靜態資源;不需要配置
    根項目:settings.py中通過TEMPLATES>DIRS配置網頁模板文件夾,通過STATICFILES_DIRS配置靜態資源文件夾
Tornado中:
    通過tornado.web.Application中的配置選項
        template_path配置網頁模板文件夾位置,static_path配置靜態資源文件夾位置
Flask中:
    默認templates/中保存網頁模板;static/中保存靜態資源,不需要配置


模板語法操作:
Django中:
    默認使用自己的模板語法:Django Template Language:DTL語法
Tornado中:
    默認使用jinja模板語法:~經過一定改造的模板語法
Flask中:
    默認使用第三方的jinja2模板語法,是在DTL語法的基礎上完善的一種專門給python使用的模板語法
"""
在該文件同級目錄下創建templates文件夾和static文件,用來保存網頁模板和靜態資源
index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用戶首頁</title>
    <link href="/static/index.css" rel="stylesheet">
</head>
<body>
<h1>用戶首頁</h1>
{% for p in plist %}   # 注意這裏的模板語法,django中{% empty %}在這裏替換爲{% else %}}
<p>{{p['name']}}</p>
{% else %}
<p>還沒有任何用戶</p>
{% endfor %}
</body>
</html>


文檔總結:

1.1. API INTRODUCTION

l flask.Flask

核心模塊之一,Flask可以構建封裝完成的WSGI應用

l flask.Flask.route(path)

核心模塊之一,Flask應用中的路由配置,主要加載在視圖操作函數上,完成path路徑和視圖函數之間的路由映射關係

l flask.Flask.run()

核心模塊之一的函數,通過run()函數將web應用部署到web服務器並啓動服務

1.2. 項目訪問

通過run()函數直接操作啓動服務器,只能在本機訪問,如果要讓所有主機所在的網絡地址都可以訪問當前web項目,添加host參數配置即可

app.run(host=“0.0.0.0”)

1.3. 調試模式

默認情況下Flask沒有啓用調試模式,可以在開發過程中,通過debug配置完成調試模式的啓用,調試模式下視圖頁面和控制檯將會展示更多的更加詳細的錯誤信息

app.debug = True

app.run(host=“0.0.0.0”)

注意:Flask項目中,調試模式的啓用,會允許客戶端執行任意python代碼,是一個非常大的安全隱患,通常情況下只是在開發過程中使用;在生產環境用嚴禁使用調試。

1.4. 路由操作

Flask項目中,路由通過@app.route(path)註解的方式進行添加,將訪問地址和視圖處理函數直接進行關聯

from flask import Flask

app = Flask(__name__)

@app.route(“/”)

def index():

pass

@app.route(“/login”)

def login():

    pass

1.5. RESTful參數操作

路由將對應URL請求路徑和視圖處理函數進行了關聯,我們可以通過URL地址進行參數的傳遞,也就是RESTful風格的參數操作

Flask中,在路由路徑中通過<變量名稱>的方式定義URL路徑可以接受參數,也可以在參數定義時,定義參數變量的數據類型<類型:變量名稱>

在視圖處理函數的參數列表中,通過該變量名稱可以直接使用接收到的參數

from flask import Flask

app = Flask(__name__)

@app.route(“/user/<username>“)

def check_username(username):

     return “hello %s” % username

@app.route(“/userinfo/<int:user_id>“)

def check_userinfo(user_id):

     return “hello %s” % user_id

1.6. GET/POST請求操作

@app.route(path)常規路由定義時,參數的傳遞方式可以通過RESTful方式進行提交,如果是傳統的GET/POST提交參數數據時,可以通過Flask指定的方式進行參數數據的獲取

from flask import Flask, request

app = Flask(__name__)

@app.route(“/get”, methods=[“GET”])

def get_param():

print(request.args.get(“param_name”))

return “hello get method!”

@app.route(“/post”, methods=[“POST”])

def post_param():

print(request.form.get(“name”))

return “hello post method!”

1.7. 視圖模板

Flask中通過flask.render_template(..)渲染指定的網頁模板給瀏覽器查看,同時可以附帶對應的參數在網頁模板中進行展示

模板的定義不需要配置任何選項,自動在templates/目錄中查詢對應的模板頁面

並且在網頁模板中,可以正常使用Jinja2模板語法進行數據的渲染展示操作

from flask import Flask, render_template

app = Flask(__name__)

@app.route(“/”)

def index():

users = [

         {“name”:”admin”, “age”:12},

{“name”:”manager”, “age”:23},

{“name”:”administrator”, “age”:11},

]

    return render_template(“index.html”, users=users)

templates/index.html視圖網頁中通過模板語法渲染數據

<ul>     {% for u in users%}     <li>{{u.name}}--{{u.age}}</li>     {% endfor %} </ul>

注意:視圖處理函數中,返回渲染數據,可以直接返回渲染的網頁,同樣可以返回下一個請求的路由

render_template(..):渲染返回指定的網頁模板數據

redirect(..):渲染返回下一個繼續請求的路由

1.8. 靜態文件

Flask中的靜態文件,存放在項目的static/文件夾中,可以直接定義各種靜態文件並在項目網頁模板中通過/static/..的路徑進行操作

項目根目錄下創建static/文件夾,文件夾中創建對應的靜態文件index.css

/home_dir/static/index.css

*{margin:0px;padding:0px;font-size:16px;}

p{color:orange;}

在頁面模板中,可以通過路徑引入對應的靜態文件

/home_dir/templates/index.html

<!doctype html>

<html>

..

    <link rel=“stylesheet” href=“/static/index.css”>

..

</html>





























































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章