游客发表
用Flask写一个能跑的网站网站,代码量比想象中少得多。实例去年帮朋友做一个花店展示页,网站从零到上线只用了三个小时——当然,实例后面改样式花了两天。网站这篇文章不聊Django那种重型框架,实例就说说怎么用Flask把HTML、网站CSS和Python逻辑串起来,实例让一个真实可访问的网站站点跑起来。
先装Flask。实例命令行敲 pip install flask,网站几秒钟的实例事。然后新建一个 app.py,网站写下面这几行:
from flask import Flask,实例 render_template app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') if __name__ == '__main__': app.run(debug=True) 就这么短。@app.route('/') 告诉Flask:有人访问根路径时,网站去执行 index 函数。函数返回什么,浏览器就显示什么。render_template 会去项目里的 templates 文件夹找 index.html。所以目录结构得是:
myproject/ ├── app.py └── templates/ └── index.html 现在写 index.html。别把它当模板,就当普通HTML写,只是多了一些 { { }} 占位符。比如:
<!DOCTYPE html> <html> <head> <title>{ { shop_name }}</title> </head> <body> <h1>欢迎来到{ { shop_name }}</h1> <p>今天推荐:{ { today_pick }}</p> </body> </html> Python那边改一下 index 函数:
@app.route('/') def index(): return render_template('index.html', shop_name='街角花房', today_pick='白玫瑰') 刷新浏览器,页面就变了。这种把数据从Python传给HTML的方式,是Flask最舒服的地方——不用拼字符串,不用手动替换,Jinja2模板引擎自动处理。我第一次用的时候觉得像变魔术,后来发现原理就是字符串替换加逻辑控制,只是封装得干净。
光有静态展示不够。花店需要展示不同分类,比如“鲜花”“绿植”“花器”。路由可以带参数:
@app.route('/category/<name>') def category(name): products = { 'flower': ['玫瑰', '百合', '向日葵'], 'plant': ['绿萝', '龟背竹'], 'vase': ['陶瓷瓶', '玻璃瓶'] } items = products.get(name, []) return render_template('category.html', items=items, cat=name) 访问 /category/flower 就会列出三种花。这里 <name> 是URL里的变量,Flask自动把它作为参数传给函数。注意 products.get(name, []) 这个写法——如果用户乱输一个 /category/abc,不会报错,只会显示空列表。这种防御性写法在实际项目里很常见,省得用户看到500错误页。
模板里用循环渲染列表:
<ul> { % for item in items %} <li>{ { item }}</li> { % endfor %} </ul> { % %} 是Jinja2的控制语句,{ { }} 是输出变量。两者别搞混。我见过新手把 for 写成 { { for }},结果页面直接显示“for”这个词,调试半天。
样式怎么办?Flask默认会找 static 文件夹。在项目根目录建一个 static/style.css,然后在HTML里写 <link rel="stylesheet" href="/static/style.css">。更规范的做法是用 url_for:
<link rel="stylesheet" href="{ { url_for('static', filename='style.css') }}"> 这样即使以后部署到子路径下,链接也不会断。我吃过亏——本地测试好好的,一上服务器CSS全丢,就是因为写死了 /static/。
表单处理也不复杂。花店要收集预订信息,写个 /order 路由:
from flask import request @app.route('/order', methods=['GET', 'POST']) def order(): if request.method == 'POST': name = request.form['name'] phone = request.form['phone'] # 这里可以存数据库或发邮件 return f'收到,{ name},电话{ phone}' return render_template('order.html') 对应的 order.html 里放一个 <form method="post">,两个 <input>。提交后 request.form 就能拿到值。注意 methods 参数必须显式写 ['GET', 'POST'],否则Flask只接受GET,POST会报405错误。
数据库?小项目用SQLite加 sqlite3 模块就够。但那是另一个话题了。先把上面这些跑通,你会得到一个能展示、能交互、有样式的网站。部署的话,gunicorn 加 nginx 是常见组合,不过本地 flask run 调试阶段足够用。
最后说个细节:debug=True 在开发时很有用,改代码自动重启,出错显示堆栈。但上线一定要关掉,否则任何人都能看到你的源码路径和变量值。我见过有人忘了关,结果服务器上 /console 页面直接暴露,挺危险的。
友情链接