3

我已经学习 python 有一段时间了,最​​近我决定开始学习 web 开发方面的东西。我有使用 PHP 和 PHP 框架以及 ruby​​ 的经验,其中:

  • 路由在(单个)文件中定义,然后在该文件中,每个路由都分配给一个模型(py 文件),该模型将唯一地处理与该路由匹配的传入请求。

如何使用flask AND webapp2实现这一目标?

我完整阅读了文档和教程,但这让我很困惑。我只想要一个文件,其中设置了所有路由以及应该如何处理它们,然后每个路由请求都由它自己的模型(python 文件)处理。

所有示例都指向单文件应用程序。

非常感谢,真的。请教,亲切,简单的方式。

4

2 回答 2

5

Webapp2 实际上开箱即用地提供了这一点 -WSGIApplication类实例Router在其router属性中提供了一个实例,可用于集中式 URL 映射,如文档中所示

Flask 没有,但这实际上以最基本的形式记录在Patterns for Flask: Lazy Loading中。使用LazyView它定义的类,您可以构建一个系统来提供中央 URL 映射 - 可以是每个模块中的预定义符号,也可以是模块中的特定函数或类实例。

实际上,我最近发布了一个包 ( HipPocket ),它提供了包装器来简化此模式的入门。它为此提供了两个类LateLoaderMapper. 使用 HipPocket,您的中央路由配置文件可能如下所示(假设包布局类似于此处讨论的内容):

应用程序.py

from flask import Flask

app = Flask("yourapp")
# ... snip ...

网址.py

from .app import app
from hip_pocket import Mapper

mapper = Mapper(app)

mapper.add_url_rule("/", "index.index")
mapper.add_url_rule("/test", "index.test_endpoint", methods=["POST"])

mapper.add_url_rule("/say-hello/<name>",
                        "say_hello.greeter",
                        methods=["GET", "POST"])

索引.py

def index():
    return "Hello from yourapp.index.index!"

def test_endpoint():
    return "Got a post request at yourapp.index.test_endpoint"

say_hello.py

def say_hello(name=None):
    name = name if name is not None else "World"
    return "Greetings {name}!".format(name=name)

运行应用程序.py

from yourapp.app import app
from yourapp.urls import mapper
# We need to import the mapper to cause the URLs to be mapped.

if __name__ == "__main__":
    app.run()

欢迎请求请求问题报告

于 2012-06-14T22:37:30.077 回答
3

根据我使用烧瓶的经验,您不能在中央文件中声明路由配置。路由处理是通过使用路由声明来完成的。根据我对 python 框架的经验,路由处理是在更精细的函数级别而不是文件级别完成的。即使在确实有更集中的路由配置设置的框架中,路由也被定义为与特定的视图/控制器功能相关联,而不仅仅是一个 python 文件。

如前所述,每个框架都以不同的方式处理它。我详细研究过的三个框架,django、pyramid 和 flask,都以不同的方式处理它。与您要查找的内容最接近的是 django,它有一个 urls.py 文件,您可以在其中放置所有 url 配置,但它再次指向功能级别项目,而不是更高级别的 .py 文件。Pyramid 将 url 声明的一部分放入__ init __主模块的 .py 文件并使用装饰器将命名路由与函数相关联。然后你有烧瓶,你提到已经看过它,它似乎只是为了“简单起见”而使用装饰器,因为它们试图减少需要使用或编辑来获取应用程序的整体文件和配置文件的数量概念进入服务空间。

于 2012-06-14T20:06:55.160 回答