你打开Python教程的那一刻是不是看到“Hello World”就以为入门了等到真正要写一个能跑在浏览器里的Web应用时发现自己连路由和HTTP都分不清。太多人卡在“从零到第一个Web应用”这条路上不是Python难而是根本不知道哪些知识是真的要用到的。Python入门最大的谎言就是让你先学完一本500页的书再动手。等你把列表推导式、装饰器、生成器全都背下来还没碰到Web开发的门槛热情早就凉了。真正的路径应该像搭乐高——先搭一个能转动的轮子再慢慢加固车身。环境搭建先学会在终端里“说话”别急着打开IDE先打开你的终端Mac的Terminal或Windows的PowerShell。输入python --version如果输出一串数字恭喜你环境已经在了。如果没有去python.org下载安装包安装时一定要勾选“Add Python to PATH”。接下来你需要三个工具VSCode、pip、venv。VSCode是编辑器pip是Python的包管理器venv是虚拟环境。为什么要虚拟环境因为真实项目需要隔离依赖否则你今天装的库和明天装的库打架你根本不知道是谁的错。在终端里执行mkdir my_first_web cd my_first_web python -m venv venv source venv/bin/activate # Windows用 venv\Scripts\activate看到命令行前面多了一个(venv)说明你已经进入了一个干净的Python环境。这才是职业选手的起跑线。基础语法速成只学20%就会80%你不需要成为Python语法专家才能写Web应用。下面这些是你必须掌握的其他的边用边查。变量和数据类型记住Python是动态类型你不需要声明变量类型。name Alice就是字符串age 25就是整数。但务必要理解字符串、整数、浮点数、布尔值和列表的区别。条件判断和循环if/elif/else和for循环是Web应用里天天用的。比如根据用户角色显示不同页面或者循环展示商品列表。别在嵌套上钻牛角尖能用break和continue控制流程就够了。函数def my_func(param):定义一个函数。函数是组织代码的最小单元一个Web应用里可能有几十个函数每个负责一小块逻辑。列表和字典列表用方括号字典用花括号。字典是Web开发的核心数据结构——前端传来的数据、数据库查询结果、用户信息全是用字典表示的。面向对象初体验不懂类也能写Web但你会很快遇到代码冗余。比如两个页面都需要检查用户是否登录你会复制粘贴同样的代码。而类和方法能让你把这种通用逻辑抽出来一次写好到处用。只需知道class关键词和self参数剩下的慢慢来。记住一句话你不需要记住所有语法但必须知道“Python能做什么”。当你想实现一个功能时要能快速搜索到对应的写法。为什么一定要选一个Web框架裸写Python能处理HTTP请求吗理论上可以用socket库写一个原始服务器。但现实是没有人会用手工锯做一张桌子都用电动工具。Web框架就是你的电动工具。两个最流行的框架Django和Flask。Django像是一辆组装好的房车——轮胎、床、厨房、厕所全都有你只管往里放行李。适合大型项目但学习曲线陡峭官方文档经常让你在“配置”里打转。Flask像是一辆自行车——只有两个轮子和一个车架你想加车筐、装车灯都得自己来。对于第一个Web应用Flask是更好的选择因为它让你清楚看到每一步发生了什么路由、请求、响应、模板渲染。我的建议先用Flask做出一个小应用再回头看Django你会发现Django的“自动”功能其实是魔法而你已经知道魔法怎么变了。第一个Flask应用从“Hello World”到“用户注册”安装Flask在激活的虚拟环境中执行pip install flask然后创建一个文件app.py写下from flask import Flask app Flask(__name__) app.route(/) def home(): return h1Hello World!/h1 if __name__ __main__: app.run(debugTrue)在终端运行python app.py打开浏览器访问http://127.0.0.1:5000你看到“Hello World!”那一刻第一个Web应用诞生了。这五行代码背后发生了什么简单说app.route(/)告诉Flask当用户访问根路径时执行下面的函数并返回内容。你不需要理解内部原理只需知道“路由”就是URL和函数之间的映射。添加第二个页面模板与变量返回纯字符串很快不够用。你需要模板引擎——Flask使用Jinja2。创建templates文件夹里面放一个index.html!DOCTYPE html html body h1欢迎{{ username }}/h1 /body /html修改app.pyfrom flask import Flask, render_template app.route(/) def home(): return render_template(index.html, username开发者)重新访问你会看到“欢迎开发者”双花括号{{ }}是变量插值模板引擎会自动替换。这就是Web应用展示动态内容的基础。获取用户输入表单与请求真正的Web应用要有交互。添加一个登录页面from flask import request app.route(/login, methods[GET, POST]) def login(): if request.method POST: username request.form[username] password request.form[password] # 这里暂时不做验证直接跳转到首页 # 但你可以看到request.form字典里装着用户提交的数据 return f你输入的用户名是{username}密码是{password} return form methodpost 用户名input typetext nameusernamebr 密码input typepassword namepasswordbr input typesubmit value登录 /form 注意methods[GET,POST]这行。GET请求只是加载页面POST请求才是提交数据。区分请求方法是Web开发的基本功——GET应该只读数据POST应该修改数据。让数据持久化SQLite数据库目前所有数据都随着服务器重启消失。真正的应用需要数据库。Python自带SQLite无需安装。创建一个数据库文件并建表import sqlite3 def init_db(): conn sqlite3.connect(users.db) c conn.cursor() c.execute(CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password TEXT NOT NULL)) conn.commit() conn.close() init_db() # 启动时运行修改登录功能让用户注册并存储到数据库app.route(/register, methods[GET, POST]) def register(): if request.method POST: username request.form[username] password request.form[password] conn sqlite3.connect(users.db) c conn.cursor() try: c.execute(INSERT INTO users (username, password) VALUES (?, ?), (username, password)) conn.commit() # 注意这里没有对密码加密生产环境绝对不能这么干。 return 注册成功a href/login登录/a except sqlite3.IntegrityError: return 用户名已存在请换一个。 finally: conn.close() return form methodpost 用户名input typetext nameusernamebr 密码input typepassword namepasswordbr input typesubmit value注册 /form 看到?占位符了吗那是防止SQL注入的必备写法。永远不要用字符串拼接SQL否则黑客可以轻松删掉你的表。会话让用户“记住”自己登录后如何保持状态用session。Flask自带的session基于cookie加密。from flask import session, redirect, url_for import os app.secret_key os.urandom(24) # 务必设置一个随机密钥否则session不安全 app.route(/login, methods[GET, POST]) def login(): if request.method POST: username request.form[username] password request.form[password] conn sqlite3.connect(users.db) c conn.cursor() c.execute(SELECT FROM users WHERE username? AND password?, (username, password)) user c.fetchone() conn.close() if user: session[user_id] user[0] session[username] user[1] return redirect(url_for(dashboard)) else: return 用户名或密码错误 return form methodpost 用户名input typetext nameusernamebr 密码input typepassword namepasswordbr input typesubmit value登录 /form app.route(/dashboard) def dashboard(): if username not in session: return redirect(url_for(login)) return f你好{session[username]}a href/logout登出/a app.route(/logout) def logout(): session.clear() return redirect(url_for(home))session就像一个挂在用户浏览器上的储物柜服务端可以往里存数据但用户看不到里面是什么因为加密了。从“能跑”到“可用”你还需要知道这些错误处理用户访问不存在的页面应该显示404而不是崩溃。Flask可以自定义app.errorhandler(404) def not_found(e): return render_template(404.html), 404使用蓝图组织代码当应用有几十个路由时所有函数堆在一个文件里会疯掉。蓝图Blueprint能让你把登录、文章、用户管理等模块拆分到不同文件。但这是进阶内容第一个应用可以先把所有代码写在一起。静态文件CSS、JavaScript、图片放在static文件夹里。在模板中引用link relstylesheet href{{ url_for(static, filenamestyle.css) }}url_for函数会根据蓝图、静态文件夹自动生成正确的URL比硬编码路径安全得多。部署让全世界看到你的应用本地跑起来只是第一步。部署到公网服务器才能真正算“构建了Web应用”。最简单的方案是使用Render或PythonAnywhere免费额度足够一个小应用。以Render为例把代码推送到GitHub仓库。在Render上新建Web Service绑定GitHub仓库。设置启动命令gunicorn app:app需要安装gunicorn。设置环境变量SECRET_KEY和数据库路径Render提供PostgreSQL或者你可以用SQLite但注意文件系统是临时的。部署后你第一次在浏览器里输入你自己应用的域名时那种成就感比任何教程结业证书都强。最后说点狠话你以为看完这篇文章就能成为Web开发者不能。阅读只能让你感觉懂了真正的学习发生在你被自己的bug折磨到凌晨三点的那一刻。你会遇到数据库锁死、路由冲突、时区混乱、CSRF攻击、SQL注入、XSS跨站脚本……所有这些坑都等着你去踩。但好消息是你已经有了一个能跑起来的样板。每个大佬的第一次Web应用都和你现在一样简陋、不安全、充满硬编码。区别在于他们接着做了第二个、第三个而大多数人停在了“Hello World”。Python Web开发入门这件事最难的不是语法、不是框架而是“开始”和“坚持”。现在关掉这篇文章打开你的终端把上面每一段代码亲手敲一遍。当你看到自己在浏览器里注册用户、登录、看到用户数据从SQLite读出并展示在页面上时你就已经跨过了那道门槛。记住最差的完整作品也比最完美的半成品有用。