ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

用Flask搭建个人网站:一次完整的Python项目实践记录

2026/9/9 2:04:08 拓冰建站 浏览量
用Flask搭建个人网站:一次完整的Python项目实践记录 从零开始花了一个周末我拥有了一个完全属于自己的网站。一直以来都想拥有一个个人网站——不是用WordPress或Hexo那种现成的而是从头到尾自己写出来的。一是为了有个地方放作品集和博客二是想真正走一遍Python Web开发的全流程。于是上个周末我打开编辑器开始了这次Flask实践。一、为什么选Flask选框架的时候没纠结太久。Django太重了自带Admin、ORM、表单验证像个开箱即用的精装房。而我想要的只是一个轻量、灵活、自己能掌控每一层的东西。Flask自称微框架核心只有路由和模板渲染数据库用什么、表单怎么验证、用户认证怎么写——全都由你自己决定。这种不给太多也不拦着你的哲学正好适合想从零学起的我。二、项目结构别把所有代码塞进一个文件网上很多Flask教程上来就在app.py里写所有路由几十行代码还行一旦功能多起来就乱成一锅粥。我参考了Flask官方教程的项目结构建了这样的目录text复制下载mywebsite/ ├── app/ # 应用主目录 │ ├── __init__.py # 应用工厂 │ ├── models.py # 数据库模型 │ ├── blog/ # 博客模块蓝图 │ │ ├── __init__.py │ │ └── routes.py │ ├── portfolio/ # 作品集模块蓝图 │ │ ├── __init__.py │ │ └── routes.py │ ├── templates/ # Jinja模板 │ └── static/ # CSS、JS、图片 ├── config.py # 环境配置 ├── requirements.txt # 依赖列表 └── run.py # 启动入口核心思想是用蓝图Blueprint把不同功能模块拆开——博客归博客作品集归作品集互不干扰。新增功能时只需新建一个蓝图目录并注册不用动核心代码。三、数据库SQLite起步够用就好数据库选了SQLite。个人网站流量不大SQLite完全够用还省去了单独安装MySQL的麻烦。用Flask-SQLAlchemy定义了两个核心模型python复制下载class Post(db.Model): id db.Column(db.Integer, primary_keyTrue) title db.Column(db.String(100), nullableFalse) content db.Column(db.Text, nullableFalse) created_at db.Column(db.DateTime, defaultdatetime.utcnow) slug db.Column(db.String(100), uniqueTrue) # URL友好标识slug字段是为了让文章URL从/post/1变成/post/hello-world——对搜索引擎和读者都更友好。数据库迁移用了Flask-Migrate每次改模型后跑一次flask db migrate就能自动生成迁移脚本不用手动写SQL。四、视图与模板Jinja2让页面活起来Flask的视图函数负责处理请求、从数据库取数据、渲染模板返回给浏览器。博客首页的逻辑很简单python复制下载blog_bp.route(/) def index(): posts Post.query.order_by(Post.created_at.desc()).all() return render_template(blog/index.html, postsposts)模板用的是Jinja2可以在HTML里嵌入Python式的逻辑。文章列表页用{% for post in posts %}循环渲染详情页通过{{ post.content }}直接输出内容。配合Markdown过滤器写文章时用Markdown语法渲染时自动转成HTML——写作体验比富文本编辑器舒服太多了。五、部署上线从本地到公网本地跑得再欢不上线就只是个玩具。部署是这次实践里最有成就感的一步。首先在服务器上创建虚拟环境、安装依赖。Flask自带的开发服务器只能用于调试生产环境必须换专业的WSGI服务器。我用的是Gunicornbash复制下载gunicorn -w 4 -b 127.0.0.1:8000 app:create_app()-w 4表示启动4个工作进程-b绑定到本地8000端口。但Gunicorn只监听本地外部访问不了所以前面还得加一层Nginx做反向代理nginx复制下载server { listen 80; server_name your-domain.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /static/ { alias /path/to/static/; # 静态文件由Nginx直接处理 } }静态文件CSS、JS、图片直接让Nginx处理动态请求才转发给Gunicorn。最后用systemd把Gunicorn做成系统服务设置开机自启和崩溃自动重启——从此网站稳如老狗。六、踩过的坑第一次部署踩了不少坑。最典型的是静态文件404——本地跑得好好的上线后CSS全丢了。原因是Nginx没配置/static/的路由所有请求都转给了Gunicorn而Gunicorn又不擅长处理静态文件。配好alias之后问题解决。还有环境变量的问题。数据库连接字符串、SECRET_KEY这些敏感信息不能写死在代码里。用python-dotenv加载.env文件既安全又方便不同环境切换。写在最后从新建一个空目录到在浏览器里输入自己的域名看到页面加载出来那种感觉跟写完一个普通项目完全不一样——这是一个真正属于你的、运行在互联网上的东西。Flask没有替我决定任何事情但正因如此我走完了从代码到上线的每一个环节。这大概就是从零搭建的意义——不是为了造轮子而是为了理解轮子是怎么转起来的。