游客发表
用Flask写一个能跑的发实Web应用,代码量可能比你想象的发实要少。去年帮朋友做一个内部工具,发实从零到部署上线,发实核心逻辑只用了不到40行Python。发实这不是发实炫技,而是发实Python Web开发最真实的日常——框架帮你兜住了HTTP协议、路由分发、发实模板渲染这些脏活累活,发实你只需要关心业务本身。发实
先看一段能直接运行的发实代码:
from flask import Flask, render_template, request app = Flask(__name__) @app.route('/') def index(): return render_template('index.html', name='访客') @app.route('/hello/<name>') def hello(name): return f'<h1>你好,{ name}</h1>' @app.route('/submit',发实 methods=['POST']) def submit(): data = request.form.get('message', '') return f'收到:{ data}' if __name__ == '__main__': app.run(debug=True) 把这段存成 app.py,终端里敲 python app.py,发实浏览器打开 localhost:5000 就能看到页面。发实三个路由分别演示了静态渲染、发实动态URL参数和表单处理。Flask的@app.route装饰器把Python函数和URL绑定,请求进来时框架自动匹配并调用对应函数,返回值直接作为HTTP响应体。
模板文件放在templates/目录下。一个最简单的index.html长这样:
<!DOCTYPE html> <html> <head><title>首页</title></head> <body> <h1>欢迎,{ { name }}</h1> <form action="/submit" method="post"> <input type="text" name="message" placeholder="输入点什么"> <button type="submit">发送</button> </form> </body> </html> { { name }}是Jinja2模板语法,Flask内置的模板引擎。它支持条件判断、循环、模板继承,但最常用的就是变量替换和{ % for %}循环。模板继承这个设计很聪明——定义一个base.html放公共头部和底部,子模板只写差异部分,维护成本直线下降。
表单提交后request.form拿到的是ImmutableMultiDict,用.get()取值比直接索引安全,键不存在时返回None而不是抛异常。这个细节新手容易踩坑,线上环境一个未捕获的KeyError就是500错误。
数据库操作绕不开ORM。SQLAlchemy配合Flask用起来顺手,定义模型就是写类:
from flask_sqlalchemy import SQLAlchemy app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True) email = db.Column(db.String(120)) def __repr__(self): return f'<User { self.username}>' 建表只需db.create_all(),增删改查用db.session。SQLite适合开发和小型部署,生产环境换PostgreSQL只需改一行连接字符串。ORM的好处是屏蔽了不同数据库的SQL方言差异,代价是复杂查询时生成的SQL可能不够高效。我的经验是:简单CRUD用ORM,报表类复杂查询直接写原生SQL,别跟性能较劲。
部署环节很多人卡住。开发服务器app.run()绝对不能用于生产,它单线程、无进程管理、性能差。标准做法是Gunicorn加Nginx:Gunicorn跑多个worker进程处理Python请求,Nginx在前面做反向代理、静态文件服务和SSL终止。一个典型的启动命令:
gunicorn -w 4 -b 127.0.0.1:8000 app:app -w 4表示4个worker,一般设为CPU核数×2+1。Nginx配置里把/static/路径直接指向文件目录,动态请求转发给Gunicorn。这套组合在中小流量下稳得很,我见过日活几万的应用跑在2核4G的云服务器上,没出过问题。
Python Web开发的魅力在于快速验证想法。Django更重、更全,适合内容管理系统这类需求明确的场景;Flask轻、灵活,适合API服务和原型开发。FastAPI这两年势头很猛,异步支持和自动文档生成是亮点,但生态成熟度还不如前两者。选哪个取决于你要解决什么问题,而不是哪个听起来更酷。
写代码的时间远少于调试和部署的时间。把日志配好,把异常捕获做扎实,比多写几个花哨的功能重要得多。
友情链接