Python Web网站实例:从零搭建一个博客系统
我上周用Flask写了个简单的站实博客网站,总共不到200行代码。站实这个例子能说明Python Web开发的站实核心套路——路由、模板和数据库,站实三者缺一不可。站实
先看路由。站实Flask里用装饰器就能定义URL映射,站实@app.route('/')就把根路径绑到函数上了。站实这比Java的站实Spring Boot省事太多,不用写配置文件,站实不用建XML。站实我见过不少从Java转Python的站实同事,第一次看到这种写法都愣住——原来路由可以这么直白。站实
数据库我用的站实是SQLite,Python自带的站实模块,连安装都省了。建表语句就三行:
CREATE TABLE posts ( id INTEGER PRIMARY KEY, title TEXT NOT NULL, content TEXT NOT NULL ); 别小看这个简单的表结构。我实际开发中发现,80%的博客系统核心功能就靠这一张表撑起来。写文章是INSERT,看文章是SELECT,删文章是DELETE。逻辑清晰得可怕。
模板引擎用的Jinja2。说实话,第一次用的时候我挺抗拒的——又要学一套新语法。但用顺手后才发现,它比字符串拼接强太多。比如显示文章列表:
{ % for post in posts %} <h2>{ { post.title }}</h2> <p>{ { post.content[:100] }}...</p> { % endfor %} 注意那个[:100]切片,直接在模板里截断摘要。这在PHP里得写个substr函数,在Jinja2里就是Python语法本身。这种无缝衔接的感觉,用过的都懂。
表单处理是另一个重点。我一开始用原始方式——手动获取POST数据,手动验证。后来发现Flask-WTF这个扩展能省一半代码。但别急着上扩展,先把原生方式搞明白。我见过太多新手一上来就套框架,结果出了问题连错误信息都看不懂。
部署这块我踩过坑。本地跑app.run()没问题,一上服务器就各种502。后来才知道要用uWSGI或Gunicorn这类WSGI服务器。现在我的习惯是:开发用Flask自带服务器,生产用Gunicorn配合Nginx反向代理。配置Nginx时记得加一行proxy_pass http://127.0.0.1:8000;,这个地址要跟Gunicorn监听的端口对上。
缓存是后来加的。文章页访问量大了之后,数据库查询明显变慢。我用了Flask-Caching,把热门文章缓存10分钟。代码改动很小:
@app.route('/post/<int:id>') @cache.cached(timeout=600) def show_post(id): post = db.query(Post).get(id) return render_template('post.html', post=post) 就这么一个装饰器,响应时间从200毫秒降到了15毫秒。别迷信什么高性能架构,很多时候加个缓存就够了。
写这个博客系统的过程,让我想起2018年第一次用Django做项目的事。当时觉得Django太重,什么都帮你搭好了,反而让人摸不着头脑。后来换了Flask才找到感觉——轻量、透明、想怎么改都行。Python社区的好处就在这里,工具多,总有一款适合你的脾气。
如果你也想试,建议别跟着教程敲一遍就完事。拆掉重写,改成你自己的博客、待办清单或记账本。等你能不看参考代码写出完整功能时,Python Web开发的门槛你就迈过去了。剩下的,不过是遇到问题查文档的熟练工罢了。






评论专区