Flaskapp:全能開發工具

一、開發環境與準備

在使用 Flask 進行Web開發前,首先需要安裝 Python 環境。 Python 是非常容易學習的一門編程語言,大量的資料和社區可以支持開發過程中的問題解決。

安裝 Flask 可以使用 pip 安裝:

pip install Flask

Flask 還需要安裝其他插件(extensions)來增強它的功能。例如,Jinja2 用於模板引擎;Werkzeug 用於 HTTP 請求。

pip install Jinja2
pip install Werkzeug

二、路由與視圖函數

Flask 的路由系統是其最重要的特性之一,路由系統負責讓 Web應用響應 HTTP 請求。Flask 使用路由裝飾器指定了一個視圖函數來處理請求。

from flask import Flask

app = Flask(__name__)

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

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

這裡定義了一個 simple 的路由,用於處理根路徑 (“/”) 的請求,這個函數將返回一個字元串響應(”Hello World!”)。現在你可以訪問 http://localhost:5000/ 來查看結果了!

三、模板引擎和模板

模板引擎可以極大地提高 Python web 應用的靈活性。 Flask 默認使用 Jinja2 這個流行的模板引擎。模板是一個帶有擴展名的文件,其中包含靜態文本和特定的動態部分,這些動態部分被稱作變數,在使用時需要渲染這些變數。

在 Flask 應用中,可以使用 render_template 函數載入模板文件。下面是一個簡單的例子:

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

@app.route('/')
def index():
    return render_template('index.html', title='Homepage')

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

這個例子定義了一個路由,當訪問根路徑時,將渲染 index.html 模板。在這個模板中,{{ title }} 是一個變數,可以在渲染時提供它的值。

四、表單

實際 Web 應用很少不涉及任何用戶交互,其中表單是最常用、最基本的一種交互方式。在 Flask 中,表單的處理由 WTForms 提供支持。

WTForms 是一個靈活且易於使用的表單處理庫,可以處理大多數 Web 應用程序需要的表單處理需求。 Flask-WTF 提供了一個集成到 Flask 應用程序中的 WTForms 擴展。

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField

class NameForm(FlaskForm):
    name = StringField('What is your name?', validators=[DataRequired()])
    submit = SubmitField('Submit')

來看看這個例子。我們新建了一個 NameForm 類,繼承與 FlaskForm 類。 StringField 對象表示一個文本欄位,SubmitField 對象表示提交按鈕。validators 參數是可選的,用於驗證輸入。

在實際視圖函數中處理表單需要用到一些套路,代碼如下:

from flask import Flask, render_template, session, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecretkey'

class NameForm(FlaskForm):
    name = StringField('What is your name?', validators=[DataRequired()])
    submit = SubmitField('Submit')

@app.route('/', methods=['GET', 'POST'])
def index():
    form = NameForm()

    if form.validate_on_submit():
        session['name'] = form.name.data
        return redirect(url_for('index'))

    return render_template('index.html', form=form, name=session.get('name'))

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

這個例子定義了一個新的路由,當它被訪問時,它會展示一個表單並處理它。 validate_on_submit 方法處理 POST 請求。參數和例子代碼的名稱相符。如果表單驗證通過,將會把 form.name.data 保存到 Flask 的 session 中。最後重定向回根頁面(這聽起來平庸卻是一種常見的技巧,可以保證在刷新頁面時,POST 請求不會被重複提交)。

五、資料庫

Flask 為不同的資料庫(如 MySQL、PostgreSQL 或 SQLite)提供了資料庫驅動程序的支持。可以根據需要選擇適當的擴展來連接到所需的資料庫。

例如:使用 SQLAlchmey(一個 Python 全棧數據工具鏈)操作 SQLite 資料庫的示例代碼:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=False, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return f"\<User {self.username}\>"

@app.route('/')
def index():
    db.create_all()

    user = User(username='John', email='john@example.com')
    db.session.add(user)
    db.session.commit()

    return 'Hello, World! The first user is added'

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

在這個示例中,定義了一個 User 模型,在其中指定了表中各列的詳細信息。這個模型繼承自 SQLAlchemy 的 Model 類,要指定主鍵,只需要設置 primary_key=True。我們的資料庫地址:sqlite:///database.db,然後程序會自動創建表,並插入一條數據。

六、Docker 化

Docker 是一個應用程序容器引擎,用於輕鬆的開發、部署和運行虛擬化應用程序。它可以輕鬆的管理應用程序的依賴性和各種環境。讓我們看看如何使用 Docker 部署 Flask 應用程序。

首先,在項目根目錄下,創建一個 Dockerfile 文件:

FROM python:3.8-alpine

WORKDIR /app

COPY . .

RUN apk add --no-cache gcc musl-dev linux-headers
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

EXPOSE 5000

ENTRYPOINT ["python", "app.py"]

這個 Dockerfile 安裝了 Python 3.8 的 Alpine Linux 版本(一個基於輕量級的 Linux 系統),然後在 /app 目錄下複製工程文件。接下來,安裝我們的依賴和將程序運行時所需要的依賴包打進一個單獨的 tar 包里,以便在任何地方安裝這些包。最後,將 5000 埠暴露並指定程序入口點。

最後,使用以下命令可以成功啟動 Docker 鏡像:

docker build -t flask .
docker run -d -p 5000:5000 flask

運行後訪問 http://127.0.0.1:5000 即可。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/242348.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:48
下一篇 2024-12-12 12:48

相關推薦

發表回復

登錄後才能評論