这是一份简要的安装 Python+VSCode 的操作教程。 主要是命令,不包含每一步为什么这么做。
0. 安装步骤概览
- 准备 Python 环境
- 装依赖,跑一次自检
- 跑示例程序
- 接 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
-
官网下载 VSCode code.visualstudio.com/ 并安装
-
装扩展 Python(Microsoft)
-
Ctrl+Shift+P→Python: Select Interpreter→ 选flask-web环境(或项目下的.venv)-
如不确定 conda 装在哪:
batconda info --base
-
-
如 PowerShell 报"在此系统上禁止运行脚本"时,用管理员身份执行一次:
powershellSet-ExecutionPolicy -ExecutionPolicy RemoteSigned
5. 装 MariaDB(免费 MySQL)数据库(可选)
如需将默认的 SQLite 升级为 MySQL 数据库:
-
下载安装 :官方地址。安装时设好 root 密码,如
abc123。 -
装驱动
batpip install pymysql -
建库 :用 MariaDB 安装包自带的 HeidiSQL 建,不用敲 SQL(安装时默认勾选,开始菜单里能找到)。
- 打开 HeidiSQL,点左下角 新建 建会话:用户
root,密码填安装时设的那个,然后点右下角 打开 按钮。 - 左侧连接树里右键单击刚建好的会话 → 创建新的 → 数据库。
- 名称填
flaskweb,字符校对选utf8mb4_unicode_520_ci,点 确定。
- 打开 HeidiSQL,点左下角 新建 建会话:用户
-
改
.env:iniDATABASE_URL=mysql+pymysql://root:你的密码@127.0.0.1:3306/flaskweb -
重新建表 :
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)