Python 30 天 – 第 25 天 – Web开发II(python web开发)
本文是 30 天 Python 挑战系列的一部分。您可以在此处找到本系列之前所有帖子的链接
从 Flask 应用程序的基本框架开始,今天我实现了一些基本功能来完成我们简单的极简博客应用程序。首先使用 Flask 的模板继承模式,我致力于重用通用模板代码,然后添加了两个虚拟帖子来动态呈现它们。最后,生成一个 requirements.txt 文件以将所有包依赖项存储在一个文件中,然后可以使用该文件使用单个命令下载所有包。
模板继承
目前,index.html、about.html 模板包含重复的 HTML 代码。由于 Flask 使用 Jinja 作为模板引擎,我们可以使用强大的模板继承概念来创建一个基础模板文件,该文件将包含所有常见的 HTML 代码,例如 HTML 骨架、导航栏、页脚等。然后其他模板可以扩展这个基础template 因此使我们的模板代码更可重用。我创建了一个基本模板文件 layout.html 来包含通用模板结构,如下所示:
layout.html
{% extends "layout.html" %}
{% block title %}Index{% endblock %}
{% block head %}
{{ super() }}
<style type="text/css">
.important { color: #336699; }
</style>
{% endblock %}
{% block content %}
<h1>About</h1>
<p class="important">
Hi. I am Arindam. I love building User Interfaces. I am currently learning
Python and created this simple blog using the Flask web development
framework.
{% endblock %}
可以创建一个模板可重用块,该块的代码需要放在 {% block block_name %} {% endblock %} {% block %} 通知模板引擎子模板可以覆盖这些部分模板。
然后其他文件可以像这样继承这个基本模板:
about.html
{% extends "layout.html" %}
{% block title %}Index{% endblock %}
{% block head %}
{{ super() }}
<style type="text/css">
.important { color: #336699; }
</style>
{% endblock %}
{% block content %}
<h1>About</h1>
<p class="important">
Hi. I am Arindam. I love building User Interfaces. I am currently learning
Python and created this simple blog using the Flask web development
framework.
{% endblock %}
在这里, super() 用于渲染父模板中定义的块的内容。
更多关于使用 Flask 的模板可以在这里找到 https://flask.palletsprojects.com/en/1.1.x/patterns/templateinheritance/
创建页面未找到路由
在 Flask 中,我们可以处理从服务器加载内容时可能发生的各种异常,例如在找不到路由时显示自定义 404 页面,在出现 500 内部服务器错误时显示自定义页面等。我创建了一个简单的not_found.html 文件,当找不到路由时将呈现该文件。
not_found.html
{% extends 'layout.html' %}
{% block title %}Page Not Found{% endblock %}
{% block content %}
<h1>Page Not Found</h1>
<p class="important">
Sorry, this page does not exist!
{% endblock %}
server.py
@app.errorhandler(404)
def page_not_found(error):
return render_template('not_found.html'), 404
添加示例帖子
为简单起见,我在模板目录中创建了一个帖子文件夹,并创建了两个虚拟帖子文件 first-post.html 和 second-post.html。然后我创建了一个 [posts.py](http://posts.py) 文件来读取所有的 post 文件并将文件的名称存储在一个可以在主页上呈现的列表中。
posts.py
import os
def get_all_post_names():
try:
post_files = os.listdir('templates/posts')
post_names = list(map(lambda x: x.split('.')[0], post_files))
return post_names
except:
print('An error occurred while fetching posts')
return []
{% extends "layout.html" %}
{% block title %}Index{% endblock %}
{% block head%}
{{ super() }}
{% endblock %}
{% block content %}
<h1 class="title">
Welcome to the Python Blog.
</h1>
<h2>Recent Posts</h2>
<ul class="post-list">
{% for post in post_names %}
<li><a href="posts/{{post}}.html">{{post}}</a></li>
{% endfor %}
</ul>
{% endblock %}
所有 Python 语句都按照 Jinja 模板语法写在 {% %} 块内。动态值用 {{ }} 放置。我们现在应该能够在主页上看到这两个帖子。现在点击一个帖子,它应该打开相应的帖子页面。为此,我们必须创建一个动态处理帖子页面的路由。
@app.route('/posts/<string:post_name>')
def show_post(post_name):
return render_template(f'posts/{post_name}.html')
此路由将处理页面名称并动态呈现相应的帖子页面。
生成一个requirements.txt文件
在我们的 Python 项目中,我们可以使用多个外部包。如果我们想与某人共享此项目,我们需要共享所有项目文件,并提及运行该项目所需的所有包以及正确的版本号。这不是一个很实用的方法。
项目中使用的所有已安装依赖项都可以使用此命令在单个 requirements.txt 文件中列出(按照惯例)以及它们的版本。
$ pip freeze > requirements.txt
这将生成项目的 requirements.txt 文件。该文件可以上传到任何 GIT 存储库。当有人下载项目时,他们只需要运行 pip install -r requirements.txt,所有与项目相关的依赖项都会自动安装准确的版本。
参考
上面的项目是使用 Python 创建 Web 应用程序的一个非常小的用例。我想列出一些有用的参考资料以供进一步探索:
- 来自 edX 的一个很棒的 Python Web 开发课程
- 使用 Flask 构建 REST API
- 使用 Django 的 REST api
- https://programminghistorian.org/en/lessons/creating-apis-with-python-and-flask
- 在 Angular 中使用 Flask
- 在 React 中使用 Flask
- Django 和 Angular 应用
这就是今天的全部内容。在本系列的剩余部分,我将简要探讨高级主题,例如机器学习和 Python 数据科学的基础知识。
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!