【Flask】學習筆記(一)入門

Flask 入門基礎python

Flask是一個輕量級的後臺框架,用Flask做爲Web框架的公司有Netfix,Reddit等,國內豆瓣,果殼等。使用flask的公司列表。Flask 有主要的兩個依賴,一個是WSGI(web server gateway Interface)web服務器網關接口,工具集-Werkzeug。另外一個是Jinjia2模板引擎web

1、搭建環境

1.安裝pip,pipenv

python3.4以上版本pip已經自動安裝好了sql

# 檢查pip是否已經安裝
$: pip --version

# 安裝某個包,例如安裝flask
$: pip install <包的名稱>
$: pip install flask

# 安裝pipenv(全局)
$: pip install pipenv

# 檢查pipenv是否安裝
$: pipenv --version

2.建立虛擬環境

虛擬環境一般用virtulenv來建立,爲了更方便的關聯虛擬環境和依賴包數據庫

$: pipenv install

3.pycharm使用省略

2、Hello Flask!

1.建立工程demo/helloflask

$: mkdir demo/helloflask
$: cd demo/helloflask
$: mkdir hello.py
$: pip install flask
$: vim hello.py

# 代碼清單
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return "hello flask"
if __name__ = '__main__':
    app.run()

# 運行    
$: python hello.py

2.步驟解析

2.1 實例化Flask類
  1. 從flask包中導入Flask類,實例化Flask類,獲得一個實例。
  2. name : Flask類構造方法第一參數爲模塊或包的名稱。幫助Flask找到須要的資源
from flask import Flask
app = Flask(__name__)
2.2 註冊路由
  1. 用戶在瀏覽器中輸入url訪問資源
  2. Flask接收到請求,而且分析url
  3. Flask爲這個url找到對於的處理函數
  4. 執行這個函數,給出響應,返回給瀏覽器
  5. 瀏覽器接收解析響應,將在頁面中展現信息
# 這一系列都是由Flask完成,咱們只須要在函數上面添加一個裝飾器app.route(),並傳入url規則做爲參數。可讓函數與url創建一個鏈接,這個過程叫作註冊路由,函數稱爲視圖函數
@app.route('/')
def hello():
    return "hello flask"
2.3 啓動Web服務器
if __name__ = '__main__':
    app.run()

在啓動的時候能夠添加參數,在run()中flask

  • debug : 是否開啓調試模式,開啓後修改的代碼會自動重啓
  • threaded: 是否開啓多線程
  • port: 啓動指定服務器的端口號,==默認端口號5000==
  • host: 默認是127.0.0.1,指定0.0.0.0 支持遠程訪問

3、路由

3.1 一個視圖能夠綁定多個路由

  1. 訪問127.0.0.1/index 127.0.0.1/hello 獲得的response是同樣的
@app.route('/index')
@app.route('/hello')
def index():
    return 'hello, Flask!'

3.2 動態url

  1. url規則中添加變量
@app.route('/hello/<name>')
def index(name):
    return 'hello %s' % name
  1. 當規則中包含變量,可是沒有傳入這個變量值的話(就是直接訪問/hello)會報錯的,因此要設置一個默認值
@app.route('/hello' , defaults={'name':'param'})
@app.route('/hello/<name>')
def index(name):
    return 'hello %s' % name
  1. url參數前還能夠添加轉換器,轉化參數類型
@app.route('/hello/<int:name_id>')
def index(name):
    return 'hello %d' % name_id

4、HTTP請求以及相應

  • http請求方式有get,post,put,delete,Flask路由規則設置請求方法
@app.route('/hello',methods = ['GET','POST'])
def index():
    return 'hello flask'
  • 重定向,例如當咱們訪問錯誤的時候,重定向到其餘頁面(狀態碼爲302)
from flask import Flask, redirect

@app.route('/index')
def index():
    return redirect('http://www.example.com')
  • 重定向到其餘視圖頁面
from flask import Flask, redirect, url_for

@app.route('/index')
def index():
    return redirect(url_for('login'))
    
@app.route('/')
def login():
    return "登入成功"
  • 錯誤相應
from flask import Flask, abort
@app.route('/404')
def not_found():
    abort(404)

5、模板與靜態文件

  1. static: 存放圖片,靜態資源文件
  2. templates: 存放html文件
  3. 模板功能是基於Jinjia2模板引擎實現的
helloflask/
    - static/
    - templates/
    - app.py

5.1 模板語法

  1. for if 經常使用控制模板輸出
{% if %}..{% else %}..{% endif %}
{% for i in message %}..{% endfor %}
  1. 變量表達式
{{  }}
  1. 插入模板
{% include "index.html" %}
  1. 導入函數
{% from 'bootstrap/form.html' import render_form  %}
{{ render_form(form) }}
  1. 繼承模板
{% extends 'base.html' %}
  1. 塊的開始與結束,一共6個塊head、title、styles、content、footer和scripts
{% block content %}{% endblock %}

5.2 渲染模板

  • 視圖中使用render_template()
- templates/
    index.html
    
@app.route('/')
def index():
    return render_template('index.html')

5.3 過濾器

  • 變量能夠經過 過濾器 修改。過濾器與變量用管道符號( | )分割,而且也 能夠用圓括號傳遞可選參數。多個過濾器能夠鏈式調用,前一個過濾器的輸出會被做爲 後一個過濾器的輸入。
  1. 將name變量標題化
{{ name|title }}
  1. 或者當前變量的長度
{{ movies|length }}
  1. 經常使用過濾器:http://jinja.pocoo.org/docs/templates/#builtin-filters
過濾器名 說明
upper 字母大寫
lower 字母小寫
capitalize 首字母大寫
truncate(6,True) 當前字符長度超過6顯示...,默認是第二個參數是false
default() 默認字符串名
trim 去除先後空格
safe 關閉自動轉義
round 四捨五入取整
abs 絕對值
first 取第一個元素
last 取最後一個元素
sum 求和
sort 排序默認升序
join 合併爲字符串

6、消息閃現

  • Flask 提供了有用的flash() 函數,閃現須要給用戶的消息,好比登入成功後會提示個消息,登入失敗後也會提示個消息,須要在模板中使用全局函數get_flash_messages() 獲取消息並將其顯示
  • 經過flash()函數發送的消息會存儲在session對象中,因此咱們須要爲程序設置密鑰。能夠經過app.secret_key屬性或配置變量SECRET_KEY設置
  1. app.py
from flask import Flask, render_template, flash, redirect, url_for
app = Flask(__name__)
app.secret_key = 'secret'
@app.route('/flash/')
def flask():
    flash("閃現")
    return redirect(url_for('hello_world'))
  1. template/index.html
<div>
        {% for message in get_flashed_messages() %}
            <div class="alert">{{ message }}</div>
        {% endfor %}
    </div>
  1. flash() 方法第二個參數彷佛消息類型,可選擇的有」message」, 「info」, 「warning」, 「error」。只需設置get_flashed_messages()方法的with_categories和category_filter
    參考:https://flask.palletsprojects.com/en/1.1.x/patterns/flashing/

7、數據庫集成

7.1 ORM 概念

  1. 對象映射關係
  2. 讓模型與數據庫產生映射關係
  3. 操做模型對象能夠實現數據庫操做
  4. 表 -> python 類 ; 字段 -> 類屬性 ;記錄 -> 類實例

7.2 安裝

$:pip install flask-sqlalchemy
對app對象初始化
db = SQLAlchemy()
db.init_app(app)

7.3 定義一張表

db = SQLAlchemy()

class User(db.Model):
    __tablename__ == 'user'
    name = db.Column(db.String(100))
    no = db.Column(db.Integer(20))
字段 說明
String 字符串
Integer 整型
Text 文本
Date 日期對象 Datetime.date
Time 時間對象 Datetime.time
DateTime 時間日期
Interval 時間間隔
Float 浮點數
Boolean 布爾值

7.4 經常使用SQLAlchemy 字段參數

參數名 說明
primary_key 若是爲True 該字段爲主鍵
unique 若是爲True 該字段不容許重複
index 若是爲True 該字段建立索引
nullable 該字段能否爲空
default 字段設置默認值

7.5 自定義代表

__tablename__ = ''

7.6 建立數據庫

db.create_all()

7.7 刪除數據庫

db.drop_all()

7.8 數據庫操做

# 調用add()方法將新建立的對象添加到數據庫會話中
db.session.add(user)
# 提交會話
db.session.commit()

7.9 數據庫讀取

<模型類> .query. <過濾方法> . <查詢方法> bootstrap

https://docs.sqlalchemy.org/en/13/orm/query.html
查詢方法 | 說明
---|---
all() | 查詢包含全部的記錄列表
first() | 查詢第一條數據,若是沒有返回None
get(ident) | 傳入主鍵值爲參數,返回豬圈記錄
count() | 返回查詢的數量
first_or_404() | 查詢第一條記錄,未找到返回404錯誤
with_paernt() | 傳入模型做爲參數,返回和這個實例相關聯的對象
paginate() | 返回Pagination對象,對記錄進行分頁操做vim

https://docs.sqlalchemy.org/en/13/orm/query.htmlapi

過濾方法 說明
filter() 使用指定的規則過濾,返回新產生的對象
filter_by() 使用指定的規則過濾(以關鍵字爲對象),返回新產生的對象
order_by 排序
group_by() 根據查詢的記錄進行分組
offset() 偏移查詢結果

7.10 ORM 一對多

  1. 當前Author 表明做者,Article表明文章
class Author(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(70), unique=True)
    phone = db.Column(db.String(20))

class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(50), index=True)
    body = db.Column(db.Text)
  1. 在Article表中創建一個外鍵,用來在Ariticle的表中存儲Author的主鍵值,創建關係
class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(50), index=True)
    body = db.Column(db.Text)
    author_id = db.Column(db.Integer, db.ForeignKey('author.id'))
  1. 定義關係屬性,可是一個做者有多個文章
class Author(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(70), unique=True)
    phone = db.Column(db.String(20))
    articles = db.relationship('Article')

參數書籍:Flask開發實戰瀏覽器

相關文章
相關標籤/搜索