2012-06-14 56 views
3

我一直在研究python相当长一段时间,最近我决定进入学习web开发的一面。我有PHP和PHP框架方面的经验,与红宝石,以及其中:如何让不同的py文件处理不同的路线?

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

如何与烧瓶webapp2的实现这一目标?

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

所有示例都导致单个文件应用程序。

非常感谢,真的。请以简单的方式善意教导。

回答

5

webapp2的实际提供这种开箱 - 的WSGIApplication类实例在其router属性提供Router实例可用于集中URL马平as shown in the documentation

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

我最近发布了一个包(HipPocket),它提供了包装来简化这种模式的入门。它为此提供了两类LateLoaderMapper。使用HipPocket,你的中心路由配置文件可能看起来像这样(这里假定包的布局类似于discussed here):

app。PY

from flask import Flask 

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

urls.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"]) 

index.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) 

run_app.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() 

Pull requestsissue reports的欢迎!

+0

如何为一个方法使用多个端点? 例如方法“view.index”中的“/”和“/ index” – hayi

+0

@hayi - 你应该可以添加另一行到'urls.py'映射'/ index'到'view.index' - e 。 G。 'mapper.add_url_rule(“/”,“view.index”)'后面跟着'mapper.add_url_rule(“/ index”,“view.index”)' –

+0

@SeanVieira您的图书馆看起来令人印象深刻,正在我的项目中使用它。我面临的一个问题是,我需要添加一个动态通配符路由。像/ context//。如何在add_url_rule函数中做到这一点 – madhairsilence

3

以我的烧瓶经验,你不能在中心文件中声明路径配置。路线处理是通过使用路线声明完成的。根据我对Python框架的经验,路径处理是在更细粒度的功能级别而不是文件级别完成的。即使在具有更集中的路由配置设置的框架中,路由也被定义为绑定到特定的视图/控制器函数,而不仅仅是python文件。如上所述,每个框架处理它的方式不同。我详细研究过的三个框架,django,pyramid和flask,都以不同的方式处理。最接近你正在寻找的是django,它有一个urls.py文件,你可以放置所有的url配置,但它又指向功能级别的项目,而不是更高级别的.py文件。金字塔与部分URL声明混合在一起,放入主模块的__ 初始 __ .py文件中,并使用装饰器将该命名路由与函数相关联。然后你有瓶,你刚才提到的,看起来只是使用装饰器为了“简单起见”,因为它们试图减少需要使用或编辑来获取应用程序的整体文件和配置文件的数量概念到服务的空间。

+0

这个“per-function”而不是“per file”设计更清晰,因为它以正确的方式使用Python命名空间。由于Python导入和编译模块的方式,这也是必要的,它使单元测试变得更容易。 –

+1

你好。我所寻找的不是PER FILE,它是PER-FUNCTION-PER-FILE,而不是将所有路由处理函数放在声明路由的同一个文件中。这应该是非常简单的事情,这就是我所追求的。每个路径处理函数都有自己的PY文件,而不是所有的堆积在一起。如何才能做到这一点? – Phil

相关问题