Python 30 天 – 第 25 天 – Web开发II(python web开发)

作者 : 慕源网 本文共3213个字,预计阅读时间需要9分钟 发布时间: 2021-10-15 共367人阅读

本文是 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 数据科学的基础知识。


慕源网 » Python 30 天 – 第 25 天 – Web开发II(python web开发)

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录