搭建 Flask Web 应用编程环境

这是一份简要的安装 Python+VSCode 的操作教程。 主要是命令,不包含每一步为什么这么做。

0. 安装步骤概览

  1. 准备 Python 环境
  2. 装依赖,跑一次自检
  3. 跑示例程序
  4. 接 VSCode

把数据库换成 MariaDB 是可选的第 5 步;修复和重装看第 7 步。

1. 准备 Python 环境

方案 A:Anaconda(多环境)

bat 复制代码
conda create --name flask-web python=3.11 -y
conda activate flask-web

Python 版本推荐 3.11+。

方案 B:venv (单项目)

  • 从官网 下载 Python。
  • 安装后修改 PATH 变量。
  • 然后在项目文件夹执行以下命令:
bat 复制代码
python -m venv .venv
.venv\Scripts\activate

2. 装依赖,跑自检

设置国内源,加速下载

bat 复制代码
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple

安装常用包

bat 复制代码
cd web-basic
pip install -r requirements.txt

requirements.txt:

text 复制代码
Flask
Flask-SQLAlchemy
Flask-Migrate
Flask-Login
python-dotenv
Flask-WTF
email-validator
#waitress

3. 跑示例程序

首次运行前建表:

bat 复制代码
flask --app app db init
flask --app app db migrate
flask --app app db upgrade

启动示例程序(见附录):

bat 复制代码
python app.py

用浏览器打开 http://127.0.0.1:5000/,看到 "users": 0 才算成功 ------ 只看 status 不行,表没建时它也是 ok。

顺手再看一个受保护接口:http://127.0.0.1:5000/profile 返回 {"error": "未登录"},说明拦截生效。

按 Ctrl+C 停止。

4. 接 VSCode

  1. 官网下载 VSCode code.visualstudio.com/ 并安装

  2. 装扩展 Python(Microsoft)

  3. Ctrl+Shift+P → Python: Select Interpreter → 选 flask-web 环境(或项目下的 .venv)

    • 如不确定 conda 装在哪:

      bat 复制代码
      conda info --base
  4. 如 PowerShell 报"在此系统上禁止运行脚本"时,用管理员身份执行一次:

    powershell 复制代码
    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

5. 装 MariaDB(免费 MySQL)数据库(可选)

如需将默认的 SQLite 升级为 MySQL 数据库:

  1. 下载安装 :官方地址。安装时设好 root 密码,如 abc123。

  2. 装驱动

    bat 复制代码
    pip install pymysql
  3. 建库 :用 MariaDB 安装包自带的 HeidiSQL 建,不用敲 SQL(安装时默认勾选,开始菜单里能找到)。

    1. 打开 HeidiSQL,点左下角 新建 建会话:用户 root,密码填安装时设的那个,然后点右下角 打开 按钮。
    2. 左侧连接树里右键单击刚建好的会话 → 创建新的 → 数据库。
    3. 名称填 flaskweb,字符校对选 utf8mb4_unicode_520_ci,点 确定。
  4. 改 .env :

    ini 复制代码
    DATABASE_URL=mysql+pymysql://root:你的密码@127.0.0.1:3306/flaskweb
  5. 重新建表 :flask --app app db upgrade 再跑一次即可。migrations/ 还在,不用再 init。

6. 样例代码

(略)

7. 修复和重建环境

遇到包冲突,如果可以确定某个包的问题,比如 flask-socketio,可以试着重装这个包:

bat 复制代码
pip install --force-reinstall flask-socketio

实在修不了,重建

bat 复制代码
conda deactivate
conda env remove --name flask-web
conda create --name flask-web python=3.11 -y
conda activate flask-web
pip install -r requirements.txt

附:示例程序

python 复制代码
import os

from dotenv import load_dotenv
from flask import Flask, jsonify, request
from flask_login import (LoginManager, UserMixin, current_user, 
    login_required, login_user, logout_user)
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.exc import SQLAlchemyError
from werkzeug.security import check_password_hash, generate_password_hash

load_dotenv()

db = SQLAlchemy()
login_manager = LoginManager()
migrate = Migrate()


class User(UserMixin, db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, nullable=False, index=True)
    password_hash = db.Column(db.String(255), nullable=False)

    def set_password(self, raw):
        ''' 保存密码哈希 '''
        self.password_hash = generate_password_hash(raw)

    def check_password(self, raw):
        return check_password_hash(self.password_hash, raw)


def create_app():
    app = Flask(__name__)
    app.config['SECRET_KEY'] = os.getenv('SECRET_KEY', 'dev-secret-change-me')
    app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL', 'sqlite:///app.db')

    db.init_app(app)
    migrate.init_app(app, db)
    login_manager.init_app(app)

    @login_manager.user_loader
    def load_user(user_id):
        return db.session.get(User, int(user_id))

    @login_manager.unauthorized_handler
    def unauthorized():
        return jsonify({'error': '未登录'}), 401

    @app.get('/')
    def index():
        state = {
            'status': 'ok',
            'user': current_user.username if current_user.is_authenticated else None,
        }
        try:
            state['users'] = db.session.query(User).count()
        except SQLAlchemyError:
            db.session.rollback()
            state['users'] = None
            state['hint'] = '数据表还没建,先执行 flask --app app db upgrade'
        return jsonify(state)

    @app.post('/register')
    def register():
        data = request.get_json(silent=True) or {}
        username = str(data.get('username') or '').strip()
        password = str(data.get('password') or '')
        if not username or not password:
            return jsonify({'error': '需要 username 和 password 两个字段'}), 400
        if db.session.query(User).filter_by(username=username).first():
            return jsonify({'error': '用户名已存在'}), 409

        user = User(username=username)
        user.set_password(password)
        db.session.add(user)
        db.session.commit()
        return jsonify({'id': user.id, 'username': user.username}), 201

    @app.post('/login')
    def login():
        data = request.get_json(silent=True) or {}
        username = str(data.get('username') or '').strip()
        password = str(data.get('password') or '')
        user = db.session.query(User).filter_by(username=username).first()
        if user is None or not user.check_password(password):
            return jsonify({'error': '用户名或密码不正确'}), 401
        login_user(user)
        return jsonify({'id': user.id, 'username': user.username})

    @app.post('/logout')
    @login_required
    def logout():
        logout_user()
        return jsonify({'status': '已登出'})

    @app.get('/profile')
    @login_required
    def profile():
        return jsonify({'id': current_user.id, 'username': current_user.username})

    return app


app = create_app()


if __name__ == '__main__':
    print('数据库  : {}'.format(app.config['SQLALCHEMY_DATABASE_URI']))
    app.run(port=5000, debug=True)
    # 生产环境服务器
    #from waitress import serve
    #serve(app, host='0.0.0.0', port=8080, threads=4)
相关推荐
winfredzhang2 天前
从零实现“照片按地理位置显示在矢量地图上”:Flask + SQLite + Leaflet 全栈实战
python·sqlite·flask
龙腾AI白云3 天前
数字孪生、具身智能、世界模型三者交叉
数据库·人工智能·机器学习·flask·pygame
hhb_6184 天前
Flask+SQLite实现用户管理接口
python·sqlite·flask
QQ14220784496 天前
基于 Flask 的「自动任务控制台」设计与踩坑实录
后端·python·flask
深圳市尚想信息技术有限公司6 天前
TM52F1376海速芯HITENX Flash-8位MCU单片机,多通道ADC + 段码显示一体化主控芯片
单片机·嵌入式硬件·mcu·flask·芯片·控制器
高级程序源7 天前
django校园寻物通失物招领平台32261-计算机课程设计、毕业设计
vue.js·python·mysql·小程序·django·flask·课程设计
高级程序源7 天前
SSM仓储管理系统31582-计算机课程设计、毕业设计
vue.js·python·mysql·小程序·flask·课程设计
高级程序源8 天前
springboot本地生活服务平台33399-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·小程序·flask·课程设计
高级程序源8 天前
django房屋租赁系统28636-计算机课程设计、毕业设计
python·mysql·elasticsearch·小程序·django·flask·课程设计
fanjiu20208 天前
flask接收消息
python·flask