目录

Flask

Flask

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

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

Flask 环境

安装virtualenv

pip install virtualenv

https://i-blog.csdnimg.cn/direct/6a51cf8554ee4a6f9ca84d57fdf07b39.png

安装Flask

pip install Flask

https://i-blog.csdnimg.cn/direct/6370fc1010614543bc3f7bd56ccb7c2d.png

Flask 应用

应用

Hello.py


from flask import Flask
app = Flask(__name__)

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

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

https://i-blog.csdnimg.cn/direct/09c972e8dc8f4d47bbdf603a26f9e2ea.png

https://i-blog.csdnimg.cn/direct/4a4d8207cadf499aa2cb22800c2084c5.png

调试模式

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


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

https://i-blog.csdnimg.cn/direct/2c3758d827604066841f4d05ff854de7.png

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

https://i-blog.csdnimg.cn/direct/b6972069e1854bd597b9dcfe3ada21e1.png

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>

https://i-blog.csdnimg.cn/direct/70b7dd3d77454139848cff65151a0f39.png

https://i-blog.csdnimg.cn/direct/c524526c56844b54b807972e97bf1ac6.png

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()

https://i-blog.csdnimg.cn/direct/490db413d15c44c9ad058350fbc90182.png

https://i-blog.csdnimg.cn/direct/8ef9f179e2274aa58631195014017c65.png

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>

https://i-blog.csdnimg.cn/direct/7e10196e1fd94a7daf5e09c80aba3f33.png

https://i-blog.csdnimg.cn/direct/714eb4355a45401dbbb972b9167dcfaa.png

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>

https://i-blog.csdnimg.cn/direct/13596963c5d3455c95076e66288a5d49.png

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>

https://i-blog.csdnimg.cn/direct/96588b4f94244b889fc75e5da36d7f0a.png

拆分服务

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()

https://i-blog.csdnimg.cn/direct/84bd11672919469a8c602209d10f8248.png