搭建 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)
相关推荐
高级程序源8 天前
django招聘网站信息爬取与分析系统79704-计算机课程设计、毕业设计
后端·python·mysql·小程序·django·flask·课程设计
lpfasd1239 天前
配置文件格式对比 与 AI Coding 的选择逻辑
python·flask·numpy
troy1289 天前
Python 基础语法(九):Django/Flask/FastAPI 三大 Web 框架详细对比解析
python·jupyter·django·flask·github·fastapi
小白学大数据10 天前
Python 项目实战:用 Flask 构建生产级 MySQL 增删改查 REST API
开发语言·人工智能·python·mysql·flask
典典分享指南10 天前
用飞书 Wiki 搭内容作战室:从零搭建团队内容协作中枢
django·flask·numpy·pyqt
life码农11 天前
python框架Flask多语言配置示例
python·flask
毕业设计70312 天前
(免费领源码)基于Python的博物馆研学活动管理系统的设计与实现22724- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
python·mysql·随机森林·pycharm·django·flask·推荐算法
深圳市尚想信息技术有限公司13 天前
HITENX海速芯TM52F1363-SSOP24 8KB Flash存储+EEPROM,国产8位MCU单片机
单片机·mcu·flask·芯片·控制器·海速芯
李高钢15 天前
Python Flask 框架入门:从零搭建你的第一个 Web 应用
前端·python·flask