用Flask搭建个人网站:一次完整的Python项目实践记录
2026/9/9 2:04:01 网站建设 项目流程

从零开始,花了一个周末,我拥有了一个完全属于自己的网站。

一直以来都想拥有一个个人网站——不是用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_key=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text, nullable=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) slug = db.Column(db.String(100), unique=True) # 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', posts=posts)

模板用的是Jinja2,可以在HTML里嵌入Python式的逻辑。文章列表页用{% for post in posts %}循环渲染,详情页通过{{ post.content }}直接输出内容。配合Markdown过滤器,写文章时用Markdown语法,渲染时自动转成HTML——写作体验比富文本编辑器舒服太多了

五、部署上线:从本地到公网

本地跑得再欢,不上线就只是个玩具。部署是这次实践里最有成就感的一步。

首先在服务器上创建虚拟环境、安装依赖。Flask自带的开发服务器只能用于调试,生产环境必须换专业的WSGI服务器。我用的是Gunicorn

bash
复制
下载
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没有替我决定任何事情,但正因如此,我走完了从代码到上线的每一个环节。这大概就是"从零搭建"的意义——不是为了造轮子,而是为了理解轮子是怎么转起来的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询