1. 程式人生 > >Python--Flask之Web框架1

Python--Flask之Web框架1

一.基本知識瞭解

#1. 匯入Flask類;
from flask import  Flask
#2. 例項化一個Flask物件,
app = Flask(__name__)
#3-1.基本路由:通過路由繫結一個檢視函式
#@app.route('/'): 告訴Flask哪個URL才能出發對應的函式, 又稱為路由;
#對應定義了一個檢視函式, 也就是返回給使用者瀏覽器顯示的內容;
# http://www.westos.org/login/

@app.route('/')
def index():
    return   "<h1>hello world</h1>"

@app.route('/login/')
def login():
    return  "login"

#4. 執行Flask應用, 可以指定ip和埠;
 # '0.0.0.0' 所有的IP都可以訪問到;
app.run('0.0.0.0', 9000)

在這裡插入圖片描述
在這裡插入圖片描述
二 路由與變數規則

常見路由規則:
1). url的一部分可以標記為變數<變數名>
2). flask中路由裡面的變數常見型別:int,string,float,path,uuid

from flask import Flask

app=Flask(__name__)
@app.route('/<int:id>/comments/')
def index(id):
    return '%s index' %(id)

@app.route('/welcome/<string:user>/')
def welcome(user):
    return 'welcome %s' %(user)

app.run()

在這裡插入圖片描述
在這裡插入圖片描述
三 URL構建與反向URL

from flask import Flask, request, url_for

app = Flask(__name__)

@app.route('/welcome/<string:user>/')
def welcome(user):
    return user + "使用者, 歡迎來到westos"

@app.route('/path/')
def path():
    print(request.headers)
    print(request.method)
    # url_for: 根據函式名, 反向生成url地址
    print("使用者正在訪問url地址:%s" % (url_for(endpoint="welcome", user="westos")))
    return "使用者正在訪問url地址:%s" % (url_for(endpoint="welcome", user="westos"))
app.run()

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
注意:
1).通過 url_for ,根據函式名,反向構建URL
2).通過 request類,可以得到其頭部資訊或者訪問模式,是 get 或者 post 等

常見get和post方法

from os import abort
from flask import Flask, render_template, request, redirect, url_for

app=Flask(__name__)
@app.route('/')
def index():
    return render_template('index.html')
@app.route('/login/',methods=['GET','POST'])
def login():
    if request.method=='POST':
        print(request.form)
        #1.如何獲取到使用者提交的資訊
        user=request.form['user']
        passwd=request.form['passwd']
        #2.判斷使用者名稱和密碼是否正確
        if user=='root' and passwd=='westos':
            #如果登陸成功,跳轉到主頁
            return redirect(url_for('index'))
        else:
            #如果登入失敗,重新登陸
            return render_template('login.html')
    else:
        #使用者是GET請求,返回的是登陸的html頁面
        #1.讀取lohin.html檔案的內容
        #2.將讀取的內容返回給使用者介面
        return render_template('login.html')
#404異常處理:類似於捕獲異常
@app.errorhandler(404)
def not_found(e):
    return render_template('404.html')
#丟擲異常
@app.route('/user/<int:user_id>/')
def user(user_id):
    if 0<int(user_id)<=100:
        return '歡迎訪問:%s' %(user_id)
    else:
        abort(404)
app.run(port=5003)

常見的HTTP請求方法
GET:
1). 獲取資訊
2). 提交的資訊會展示在url: http://www.wewtos.org/login?user=westos&passwd=westos
POST:
1). 提交資訊
2). 不在url裡面展示, 有利於資料的安全性
預設路由的接受請求方法為:__ get __

如何指定接收多個HTTP請求方法?

@app.route('/login/', methods=['GET', 'POST'])

request類的一些用法,如何判斷使用者請求的HTTP方法?

request.method()

如何獲取使用者POST請求提交的表單資料?

request.form()

四 模版渲染
Flask自帶的模版引擎:jinjia2
在html檔案中通過動態賦值 將重新翻譯好的html檔案(模板引擎生效) 返回給使用者的過程
python的Web開發中, 業務邏輯(實質就是檢視函式的內容)和頁面邏輯(html檔案)分開的, 使得程式碼的可讀性增強, 程式碼容易理解和維護
在這裡插入圖片描述
python中生成html不易修改與維護, 所以將html的內容獨立到templates目錄中
1).去當前專案目錄下尋找templtes是否存在?再去判斷templates目錄下是否有login.html檔案?
2). 讀取這個login.html檔案的內容, 作為render_template的返回值;
3). 最終返回給使用者瀏覽器:render_template(‘login.html’)
重定向和錯誤提示
1).運用redirect重新定向 html頁面
運用render_template重新渲染html頁面
2).錯誤提示:

render_template('login.html', message="使用者名稱或者密碼錯誤")

運用 jinjia2 通過後臺向前臺提示資訊,資訊內容為 message=“使用者名稱或者密碼錯誤”
404報錯處理
當訪問頁面錯誤時,通過@app.errorhandler(404)自定義404錯誤
再通過重定向訪問404專屬頁面
五 變數的顯示
通過 jinjia2 的變數規則來顯示一些變數
包含(字串、列表、字典和類)

from flask import Flask,render_template
app=Flask(__name__)

class User(object):
    def __init__(self,name,passwd):
        self.name=name
        self.passwd=passwd
    def __str__(self):
        return 'User : %s' %(self.name)
@app.route('/')
def muban():
    name='hello world'
    li=[1,2,3,4]
    d=dict(a=1,b=2)
    u=User('westos','passwd')
    return render_template('hello.html',
                           name=name,
                           li=li,
                           d=d,
                           u=u
                           )
app.run()

hello.html 頁面內容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
變數:{{name}}
<br>列表:{{li}}
{% for i in li %}
<br>列表元素顯示:{{i}}
{% endfor %}
<br>字典:{{d}}
<br>字典元素顯示:{{d.a}}
<br>字典元素顯示:{{d['b']}}
<br>物件:{{u}}
<table>
    <tr>
        <th>使用者名稱</th>
        <th>密碼</th>
    </tr>
    <tr>
        <td>{{u.name}}</td>
        <td>{{u.passwd}}</td>
    </tr>
</table>
</body>
</html>

在這裡插入圖片描述
六 過濾器與自定義過濾器

import time
from flask import Flask, render_template

app = Flask(__name__)
class User(object):
    def __init__(self, name, passwd):
        self.name = name
        self.passwd = passwd
    def __str__(self):
        return "<User: %s>" % (self.name)
        
# 自定義一個轉換時間格式的過濾器
@app.route('/')
def index2():
    name = "      this is a message"
    li = [1, 2, 4, 5]
    d = dict(a=1, b=2)
    liDict = [
        {
            'count': 100,
            'price': 30
        },
        {
            'count': 110,
            'price': 20
        },

    ]
    u = User("westos", "passwd")
    timestamp = time.time()
    return render_template('index2.html',
                           name=name,
                           li=li,
                           d=d,
                           u=u,
                           liDict=liDict,
                           timestamp=timestamp
                           )
def format_date(value, format="%Y-%m-%d %H:%M:%S"):
    #  時間戳----> 元組
    ttime = time.localtime(value)
    # 元組 --- > 指定字串
    return time.strftime("%Y-%m-%d %H:%M:%S", ttime)
app.add_template_filter(format_date, 'format_date')

@app.route('/index3/')
def index3():
    return render_template('index3.html',
                           timestamp=time.time())
app.run(port=5007)

index2.html頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--/*什麼是過濾器?-->
<!--實質上就是一個轉換函式/方法-->
{{ timestamp }}
{{ timestamp | format_date }}
<!--/*常見的字串過濾器操作:*/-->
<ul>
    <li>{{ name | upper }}</li>
    <li>{{ name | lower }}</li>
    <li>{{ "hello" | capitalize }}</li>
    <li>{{ " hello world" | capitalize }}</li>
    <li>{{ name | reverse }}</li>
</ul>
<!--/*常見數值操作*/-->
<ul>
    <!--四捨五入-->
    <li>{{ -12.9623423435 | round }}</li>
    <li>{{ -12.9623423435 | round | abs }}</li>
</ul>
<!--/*列表常見:*/-->
<ul>
    <li>{{ li }}</li>
    <li>{{ li | first }}</li>
    <li>{{ li | last }}</li>
    <li>{{ li | length }}</li>
    <li>{{ li | sum }}</li>
    <li>{{ li | sort | reverse }}</li>
    <li>{{ li | join(":") }}</li>
    <li>{{ ["hello", "world"] | upper}}</li>
    <li>{{ ["hello", "woHld"] | lower}}</li>
</ul>
<!--/*列表包含字典常用操作:*/-->
<ul>
    {% for item in liDict | sort(attribute='price', reverse=false) %}
    {{ item }}
    {% endfor %}
</ul>
</body>
</html>

在這裡插入圖片描述
七 模版的繼承
如何繼承某個模版

{% extends "模板名稱" %}

如何挖坑和填坑
挖坑:

 {% block 名稱 %}
     預設值
 {% endblock %}

填坑:

{% block 名稱 %}
   程式碼內容
{% endblock %}

如何呼叫/繼承被替代的模板
挖坑:

{% block 名稱 %}
     預設值
{% endblock %}

挖坑:

{% block 名稱 %}
#如何繼承挖坑時的預設值?
{{ super() }}
#後面寫新加的方法.
........
{% endblock %}

八 巨集macro的使用
定義marco.html

{% macro 函式名(變數)%}
html程式碼樣(包含需要替換的變數)
{% endmacro %}

可以改寫包含此巨集的html