Flask

Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架 。它被归类为 "微框架" (Microframework) ,但这并不意味着它的功能弱小,而是指其核心非常简单且易于扩展

Flask 的核心思想是提供一个简单而强大的基础,开发者可以根据项目需求自由地选择和添加其他功能库,从而构建出从简单到复杂的任何 Web 应用。

Flask 环境

安装virtualenv

pip install virtualenv

安装Flask

pip install Flask

Flask 应用

应用

Hello.py

复制代码
from flask import Flask
app = Flask(__name__)

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

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

调试模式

服务器会在代码修改后自动重新载入,并在发生 错误时提供一个相当有用的调试器。

复制代码
app.debug = True
app.run()

或者

复制代码
app.run(debug=True)

Flask 变量规则

复制代码
from flask import Flask

app = Flask(__name__)

@app.route('/hello/<name>')
def hello_name(name):
    return 'Hello %s!' % name

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

http://localhost:5000/hello/w3cschool

Flask URL构建

复制代码
from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route('/admin')
def hello_admin():
    return 'Hello Admin'

@app.route('/guest/<guest>')
def hello_guest(guest):
    return 'Hello %s as Guest' % guest

@app.route('/user/<name>')
def hello_user(name):
    if name == 'admin':
        return redirect(url_for('hello_admin'))
    else:
        return redirect(url_for('hello_guest', guest=name))

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

http://localhost:5000/user/admin

Flask HTTP方法

复制代码
from flask import Flask, redirect, url_for, request, render_template

app = Flask(__name__)

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

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

@app.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        print(1)
        user = request.form['nm']
        return redirect(url_for('success', name=user))
    else:
        print(2)
        user = request.args.get('nm')
        return redirect(url_for('success', name=user))

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

login.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:5000/login" method="post">
    <p>Enter Name:</p>
    <p><input type="text" name="nm"/></p>
    <p><input type="submit" value="submit"/></p>
</form>
</body>
</html>

Flask 模板

hello.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
我的模板html内容
<br/>{{ my_str }}
<br/>{{ my_int }}
<br/>{{ my_array }}
<br/>{{ my_dict }}
</body>
</html>

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

app = Flask(__name__)

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

@app.route('/success/<name>')
def success(name):
    my_int = 18
    my_str = 'curry'
    my_list = [1, 5, 4, 3, 2]
    my_dict = {
        'name': 'durant',
        'age': 28
    }

    # render_template方法:渲染模板
    # 参数1: 模板名称  参数n: 传到模板里的数据
    return render_template('hello.html',
                           my_int=my_int,
                           my_str=my_str,
                           my_list=my_list,
                           my_dict=my_dict)

@app.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        print(1)
        user = request.form['nm']
        return redirect(url_for('success', name=user))
    else:
        print(2)
        user = request.args.get('nm')
        return redirect(url_for('success', name=user))

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

Flask 静态文件

hello.js

复制代码
function sayHello() {
    alert("Hello World")
}
复制代码
hello.html
复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <script type="text/javascript" src="{{ url_for('static', filename = 'hello.js') }}"></script>
</head>

<body>
<input type="button" onclick="sayHello()" value="Say Hello"/>
</body>

hello.py

复制代码
from flask import Flask, render_template
from flask import redirect, url_for, request

app = Flask(__name__)

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

@app.route('/success/<name>')
def success(name):
    my_int = 18
    my_str = 'curry'
    my_list = [1, 5, 4, 3, 2]
    my_dict = {
        'name': 'durant',
        'age': 28
    }

    # render_template方法:渲染模板
    # 参数1: 模板名称  参数n: 传到模板里的数据
    return render_template('hello.html',
                           my_int=my_int,
                           my_str=my_str,
                           my_list=my_list,
                           my_dict=my_dict)

@app.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        print(1)
        user = request.form['nm']
        return redirect(url_for('success', name=user))
    else:
        print(2)
        user = request.args.get('nm')
        return redirect(url_for('success', name=user))

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

Flask 将表单数据发送到模板

复制代码
@app.route('/student')
def student():
    return render_template("student.html")

@app.route('/result', methods=['POST', 'GET'])
def result():
    if request.method == 'POST':
        result = request.form
        return render_template("result.html", result=result)

student.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:5000/result" method="POST">
    <p>Name <input type="text" name="Name"/></p>
    <p>Physics <input type="text" name="Physics"/></p>
    <p>Chemistry <input type="text" name="chemistry"/></p>
    <p>Maths <input type="text" name="Mathematics"/></p>
    <p><input type="submit" value="submit"/></p>
</form>
</body>
</html>

result.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table border=1>
    {% for key, value in result.items() %}
    <tr>
        <th> {{ key }}</th>
        <td> {{ value }}</td>
    </tr>
    {% endfor %}
</table>
</body>
</html>

Flask 重定向和错误

复制代码
from flask import Flask, redirect, render_template, request, url_for

app = Flask(__name__)

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

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST' and request.form['username'] == 'admin' and request.form['password'] == 'admin':
        user = request.form.get('username', 'default_user')
        return redirect(url_for('success', name=user))
    error = 'Invalid username or password. Please try again!'
    return render_template('login.html', error=error)

@app.route('/success/<name>')
def success(name):
    my_int = 18
    my_str = 'curry'
    my_list = [1, 5, 4, 3, 2]
    return render_template('hello.html', my_int=my_int, my_str=my_str, my_list=my_list)

@app.route('/student')
def student():
    return render_template("student.html")

@app.route('/result', methods=['POST', 'GET'])
def result():
    if request.method == 'POST':
        result = request.form
        return render_template("result.html", result=result)

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

login.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post" action="http://localhost:5000/login">
    <table>
        <tr>
            <td>Username</td>
            <td><input type='username' name='username'></td>
        </tr>
        <tr>
            <td>Password</td>
            <td><input type='password' name='password'></td>
        </tr>
        <tr>
            <td><input type="submit" value="Submit"></td>
        </tr>
    </table>
</form>
{% if error %}
<p><strong>Error</strong>: {{ error }}</p>
{% endif %}
</body>
</html>

Flask 消息闪现

复制代码
import os

from flask import Flask, flash, redirect, render_template, request, url_for

app = Flask(__name__)
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'fallback-key')

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

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST' and request.form['username'] == 'admin' and request.form['password'] == 'admin':
        flash('You were successfully logged in')
        user = request.form.get('username', 'default_user')
        return redirect(url_for('success', name=user))
    error = 'Invalid username or password. Please try again!'
    return render_template('login.html', error=error)

@app.route('/success/<name>')
def success(name):
    my_int = 18
    my_str = 'curry'
    my_list = [1, 5, 4, 3, 2]
    return render_template('hello.html', my_int=my_int, my_str=my_str, my_list=my_list)

@app.route('/student')
def student():
    return render_template("student.html")

@app.route('/result', methods=['POST', 'GET'])
def result():
    if request.method == 'POST':
        result = request.form
        return render_template("result.html", result=result)

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

hello.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <script type="text/javascript" src="{{ url_for('static', filename = 'hello.js') }}"></script>
</head>

<body>
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
<p>{{ message }}</p>
{% endfor %}
{% endif %}
{% endwith %}
<input type="button" onclick="sayHello()" value="Say Hello"/>
</body>

Flask 文件上传

复制代码
import os

from flask import Flask, render_template, request
from flask import flash, redirect, url_for
from werkzeug.utils import secure_filename

app = Flask(__name__)
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'fallback-key')
app.config['UPLOAD_FOLDER'] = 'upload/'

@app.route('/upload')
def upload_file():
    return render_template('upload.html')

@app.route('/uploader', methods=['GET', 'POST'])
def uploader():
    if request.method == 'POST':
        f = request.files['file']
        print(request.files)
        f.save(os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(f.filename)))
        return 'file uploaded successfully'

    else:
        return render_template('upload.html')

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

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST' and request.form['username'] == 'admin' and request.form['password'] == 'admin':
        flash('You were successfully logged in')
        user = request.form.get('username', 'default_user')
        return redirect(url_for('success', name=user))
    error = 'Invalid username or password. Please try again!'
    return render_template('login.html', error=error)

@app.route('/success/<name>')
def success(name):
    my_int = 18
    my_str = 'curry'
    my_list = [1, 5, 4, 3, 2]
    return render_template('hello.html', my_int=my_int, my_str=my_str, my_list=my_list)

@app.route('/student')
def student():
    return render_template("student.html")

@app.route('/result', methods=['POST', 'GET'])
def result():
    if request.method == 'POST':
        result = request.form
        return render_template("result.html", result=result)

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

upload.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <title>File Upload</title>
</head>
<body>
<form action="http://localhost:5000/uploader" method="POST" enctype="multipart/form-data">
    <p><input type="file" name="file"/></p>
    <p><input type="submit" value="提交"/></p>
</form>
</body>
</html>

拆分服务

login.py

复制代码
import os

from flask import Flask, render_template, request, flash, redirect, url_for

def create_login_app():
    app = Flask(__name__)
    app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'fallback-key')

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

    @app.route('/login', methods=['GET', 'POST'])
    def login():
        if request.method == 'POST' and request.form['username'] == 'admin' and request.form['password'] == 'admin':
            flash('You were successfully logged in')
            user = request.form.get('username', 'default_user')
            return redirect(url_for('success', name=user))
        error = 'Invalid username or password. Please try again!'
        return render_template('login.html', error=error)

    @app.route('/success/<name>')
    def success(name):
        my_int = 18
        my_str = 'curry'
        my_list = [1, 5, 4, 3, 2]
        return render_template('hello.html', my_int=my_int, my_str=my_str, my_list=my_list)

    return app

if __name__ == '__main__':
    app = create_login_app()
    app.run(port=5001)

login.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post" action="http://localhost:5001/login">
    <table>
        <tr>
            <td>Username</td>
            <td><input type='username' name='username'></td>
        </tr>
        <tr>
            <td>Password</td>
            <td><input type='password' name='password'></td>
        </tr>
        <tr>
            <td><input type="submit" value="Submit"></td>
        </tr>
    </table>
</form>
{% if error %}
<p><strong>Error</strong>: {{ error }}</p>
{% endif %}
</body>
</html>

student.py

复制代码
from flask import Flask, render_template, request

def create_student_app():
    app = Flask(__name__)

    @app.route('/')
    def student():
        return render_template("student.html")

    @app.route('/result', methods=['POST', 'GET'])
    def result():
        if request.method == 'POST':
            result = request.form
            return render_template("result.html", result=result)

    return app

if __name__ == '__main__':
    app = create_student_app()
    app.run(port=5002)

student.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:5002/result" method="POST">
    <p>Name <input type="text" name="Name"/></p>
    <p>Physics <input type="text" name="Physics"/></p>
    <p>Chemistry <input type="text" name="chemistry"/></p>
    <p>Maths <input type="text" name="Mathematics"/></p>
    <p><input type="submit" value="submit"/></p>
</form>
</body>
</html>

upload.py

复制代码
import os

from flask import Flask, render_template, request
from werkzeug.utils import secure_filename

def create_upload_app():
    app = Flask(__name__)
    app.config['UPLOAD_FOLDER'] = 'upload/'

    # 确保上传目录存在
    if not os.path.exists(app.config['UPLOAD_FOLDER']):
        os.makedirs(app.config['UPLOAD_FOLDER'])

    @app.route('/')
    def upload_file():
        return render_template('upload.html')

    @app.route('/uploader', methods=['GET', 'POST'])
    def uploader():
        if request.method == 'POST':
            f = request.files['file']
            print(request.files)
            f.save(os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(f.filename)))
            return 'file uploaded successfully'
        else:
            return render_template('upload.html')

    return app

if __name__ == '__main__':
    app = create_upload_app()
    app.run(port=5003)

student.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:5002/result" method="POST">
    <p>Name <input type="text" name="Name"/></p>
    <p>Physics <input type="text" name="Physics"/></p>
    <p>Chemistry <input type="text" name="chemistry"/></p>
    <p>Maths <input type="text" name="Mathematics"/></p>
    <p><input type="submit" value="submit"/></p>
</form>
</body>
</html>

run_all.py

复制代码
import os
import subprocess
import sys
import time

def run_all_services():
    """
    同时运行所有 Flask 服务
    """
    # 获取当前目录
    current_dir = os.path.dirname(os.path.abspath(__file__))

    # 定义要运行的服务
    services = [
        {
            'name': 'Login Service',
            'script': 'login.py',
            'port': 5001
        },
        {
            'name': 'Student Service',
            'script': 'student.py',
            'port': 5002
        },
        {
            'name': 'Upload Service',
            'script': 'upload.py',
            'port': 5003
        }
    ]

    processes = []

    try:
        # 启动所有服务
        for service in services:
            script_path = os.path.join(current_dir, service['script'])
            if os.path.exists(script_path):
                print(f"启动 {service['name']} (端口: {service['port']})...")
                # 使用 subprocess.Popen 启动进程
                process = subprocess.Popen([
                    sys.executable,
                    script_path
                ])
                processes.append(process)
                print(f"{service['name']} 已启动,PID: {process.pid}")
                time.sleep(1)  # 稍微延迟以避免端口冲突
            else:
                print(f"错误: 找不到文件 {service['script']}")

        print("\n所有服务已启动:")
        for service in services:
            print(f"  - {service['name']}: http://localhost:{service['port']}")

        print("\n按 Ctrl+C 停止所有服务")

        # 等待所有进程完成
        for process in processes:
            process.wait()

    except KeyboardInterrupt:
        print("\n正在停止所有服务...")
        # 终止所有子进程
        for process in processes:
            if process.poll() is None:  # 如果进程还在运行
                process.terminate()
                try:
                    process.wait(timeout=5)  # 等待最多5秒
                except subprocess.TimeoutExpired:
                    process.kill()  # 如果还不能正常退出,则强制杀死
        print("所有服务已停止")

if __name__ == '__main__':
    run_all_services()

Flask SQLAlchemy

1.安装Flask-SQLAlchemy扩展

pip install flask-sqlalchemy

2.导入SQLAlchemy类

from flask_sqlalchemy import SQLAlchemy

3.创建一个Flask应用程序对象并为要使用的数据库设置URI

复制代码
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.sqlite3'

4.使用应用程序对象作为参数创建SQLAlchemy类的对象

复制代码
db = SQLAlchemy(app)
class Students(db.Model):
    id = db.Column('student_id', db.Integer, primary_key = True)
    name = db.Column(db.String(100))
    city = db.Column(db.String(50))  
    addr = db.Column(db.String(200))
    pin = db.Column(db.String(10))

    def __init__(self, name, city, addr, pin):
        self.name = name
        self.city = city
        self.addr = addr
        self.pin = pin

5.运行**create_all()**方法

db.create_all()

相关推荐
爱分享的鱼鱼2 小时前
为什么使用express框架
前端·后端
程序员清风2 小时前
字节三面:微博大V发博客场景,使用推模式还是拉模式?
java·后端·面试
eqwaak02 小时前
Flask与Django:Python Web框架的哲学对决
开发语言·python·科技·django·flask
笨蛋不要掉眼泪3 小时前
SpringBoot项目Excel模板下载功能详解
java·spring boot·后端·spring·excel·ruoyi
程序员蜗牛3 小时前
你写代码会复用公共SQL么?
后端
猿究院-陆昱泽3 小时前
Redis 主从同步:原理、配置与实战优化
redis·后端·java-ee·intellij-idea
Python极客之家3 小时前
基于机器学习的心血管疾病智能预测系统
人工智能·python·机器学习·数据挖掘·数据分析·毕业设计·课程设计
老葱头蒸鸡3 小时前
(23)ASP.NET Core2.2 EF关系数据库建模
后端·asp.net
Java-云海3 小时前
使用Python实现自动编写Word全自动化系统
运维·python·自动化·word