游客发表
打开一个Python网站的网站源码,你大概率会看到一堆文件夹:templates、源码static、网站app.py、源码requirements.txt。网站这不是源码巧合。Flask和Django这两个框架把项目结构给“标准化”了,网站你按它的源码规矩来,代码就能跑;不按规矩来,网站报错能折腾你一整天。源码
我拿一个最简单的网站Flask项目举例。根目录下有个app.py,源码里面写着:
from flask import Flask,网站 render_template app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') 这几行代码干的事很明确——启动一个Web服务,当有人访问根路径时,源码把templates文件夹里的网站index.html渲染出来扔给浏览器。就这么简单。但新手容易卡在“为什么我的HTML改了页面没变”这种问题上。原因是Flask默认开启了模板缓存,生产模式下改文件不重启服务,页面不会更新。得加一句 app.config['TEMPLATES_AUTO_RELOAD'] = True 才能实时刷新。
templates文件夹里放的是Jinja2模板,不是纯HTML。你会在里面看到 { { variable }} 和 { % for item in list %} 这种语法。这是Python代码嵌入HTML的方式。比如一个博客列表页,模板里写:
{ % for post in posts %} <h2>{ { post.title }}</h2> <p>{ { post.content[:100] }}</p> { % endfor %} 后端传给模板一个posts列表,模板自动循环渲染。这种设计把逻辑和展示分开了,但也没分得那么干净——Jinja2里还能写if-else、过滤器、甚至调用Python函数。有人觉得灵活,有人觉得容易写乱。我的看法是:模板里超过三行的逻辑就该挪回Python端。
static文件夹更直接。CSS、JavaScript、图片全扔里面。Flask默认映射到 /static/ 路径下。你在HTML里写 <link rel="stylesheet" href="/static/style.css"> 就能加载。注意这个路径是写死的,别用相对路径。我见过有人把static文件夹改名成assets,结果所有静态资源404,排查半天才发现是Flask默认配置不认这个名。
requirements.txt是依赖清单。里面一行一个包名,比如:
Flask==2.3.0 SQLAlchemy==2.0.0 gunicorn==21.0.0 部署的时候 pip install -r requirements.txt 一把装齐。版本号最好写死,不然某天自动升级到不兼容的新版本,线上直接崩。我吃过这个亏——Flask从1.x升到2.x,某些导入路径变了,本地跑得好好的,服务器上就报ImportError。
如果是Django项目,源码结构更重。settings.py、urls.py、views.py、models.py各司其职。Django自带ORM和Admin后台,代码量比Flask大不少。一个典型的Django视图长这样:
from django.shortcuts import render from .models import Article def article_list(request): articles = Article.objects.all() return render(request, 'articles/list.html', { 'articles': articles}) 跟Flask的差别在于,Django的ORM直接绑在模型上,Article.objects.all() 就是查全表。Flask通常配SQLAlchemy,写法是 Article.query.all()。功能一样,风格不同。选哪个看项目规模——小工具用Flask,十分钟能跑起来;带用户系统和后台管理的,Django省事得多。
还有一点常被忽略:wsgi.py。这个文件是服务器和Python应用之间的接口。开发时用 flask run 或 python manage.py runserver 没问题,但上线必须用gunicorn或uWSGI来跑wsgi.py。直接拿开发服务器扛流量,并发一上来就卡死。别问我是怎么知道的。
看源码时多留意配置文件。config.py、.env、settings.py里藏着数据库密码、密钥、调试开关。这些别提交到Git。我见过一个开源项目把SECRET_KEY硬编码在app.py里,任何人拿到源码就能伪造session。安全这事,从看源码的第一天就得当回事。
友情链接