1. 程式人生 > >flask開發筆記

flask開發筆記

更新ing
不適合新手入門

虛擬環境

  • 安裝虛擬環境
    pip install virtualenv
  • 新建環境
    virtualenv [name]
  • 啟用環境
    在進入虛擬環境目錄下Scripts資料夾後
    activate
  • 退出環境
    在進入虛擬環境目錄下Scripts資料夾後
    deactivate

Debug模式

  • 開啟
    app.run(debug=Ture)
  • 關閉
    app.run(debug=False)

配置檔案

新建一個config.py

#encoding utf-8

DEBUG = Ture

然後在主程式裡面匯入

import config

最後應用

app.config.from_object(config)

url傳入引數

@app.route('/article/<id>')
def article(id):
  return u"%s" % id

url反轉

from flask import url_for
#
url_for("article", id="123")
# return /article/123

重定義向

from flask import redirect
#
return redirect(url_for("login"))
return redirect("/login")

模板

template檔案下新建一個index.html

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Hello, {{ name }}</h1>
    <p>e-mail:{{ email }}</p>
</body>
</html>
#encoding: utf-8

from flask import Flask, render_template
import config

app = Flask(__name__)
app.config.from_object(config)

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

@app.route('/user/<name>/<email>')
def name(name,email):
    context={
        'name':name,
        'email':email
    }
    return render_template('index.html', **context)
    # = return render_template('index.html', name=name, email=email)

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

jinjia2語法

模板繼承

{% extends 'base.html' %}

{% block main %}
{{ super() }}
{% endblock %}

flash

使用了bootstrap樣式

{% with messages = get_flashed_messages() %}
    {% if messages %}
    {% for message in messages %}
        <div class="alert alert-warning">
            <button type="button" class="close" data-dismiss="alert"> &times;</button>
            {{ message }}
        </div>
    {% endfor %}
    {% endif %}
{% endwith %}

載入靜態檔案

url_for('static', filename='css/base.css')

MySQL資料庫

進入MySQL 5.7 Command Line Client - Unicode輸入密碼後

  • 建立
    create database [databaseName] charset utf8;
  • 切換資料庫
    use [databaseName]
  • 檢視
    show tables
    desc [tableName]
    select * from [tableName]
  • 刪除
    delete from [tableName] 刪除表資料
  • 配置
DIALECT = 'mysql'
DRIVER = 'mysqldb'
USERNAME = 'root'
PASSWORD = 'root'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'db_demo1'

SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT, DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False

模型操作

  • 建立模型
    Example:
class User(db.Model):
    __tablename__='user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    pw = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(100), nullable=False, unique=True)

    def __repr__(self):
        return '<User %r>' % self.username
  • 提交
    db.session.commit()
  • 新增
    db.session.add()
  • 刪除
    db.session.delete()
  • 建立資料庫
    db.create_all()
  • 刪除所有資料
    db.drop_all()

python裝飾器

*args,**kwargs可以代表任何形式的形參

from functools import wraps
#...
def my_decorator(func):

  @wraps(func)
  def wrapper(*args,**kwargs):
    #do something
    func(*args,**kwargs)
  return wrapper
#...
@my_decorator
def run():
  pass

資料庫Models定義

  • 關聯模型

    # 外來鍵定義
    auther_id = db.Column(dp.Integer, db.ForeignKey('user.id'))
    # 互相引用
    auther = db.relationship('User', backref=db.backref('questions'))

藍圖

目的:為了使業務邏輯更加清晰

專案結構:

├── project
│   ├── app # 業務目錄
│   │   ├── auto
│   │   │   └── views.py
│   │   └── main
│   │       └── views.py
│   ├── main.py # 入口程式

app.main.views.py

from flask import Flask, Blueprint

main = Blueprint('main',__name__)

@main.route('/')
def index():
    return 'Main'

app.auto.views.py

from flask import Flask, Blueprint

auto = Blueprint('auto',__name__)

@auto.route('/')
def login():
    return 'Auto'

main.py

from flask import Flask
from app.main.views import *
from app.auto.views import *
app = Flask(__name__)
app.register_blueprint(main) # 掛載藍圖main
app.register_blueprint(auto,url_prefix='/auto') # 掛載藍圖auto,並指定訪問字首

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

於是訪問/時,顯示Main,而訪問/auto/,顯示Auto

  • 注意

    url_for('main.index') # 需要指定藍圖,如main
    url_for('.index') # 可以預設相對定位
    
    # 靜態檔案 URL 是 /admin/static 
    admin = Blueprint('admin', __name__, static_folder='static')
    
    # 真正的模板檔案為 yourapplication/admin/templates/admin/index.html
    admin = Blueprint('admin', __name__, static_folder='static')