【问题标题】:How to get handler class based on the URL in a handler itself?如何根据处理程序本身中的 URL 获取处理程序类?
【发布时间】:2013-04-02 02:07:07
【问题描述】:

我想了很久怎么问这个问题。如果标题不够清楚,请见谅。

所以我有一个单页应用程序,其中所有路由都在 JavaScript (AngularJS) 中完成。从服务器我根据需要只返回部分 HTML。现在我想确保 Google 可以使用 _escaped_fragment_ 索引我的应用程序。例如,在我的应用程序中,我有一个 URL:

http://example.com/user/profile/a

这将变成:

http://example.com/?_escaped_fragment_=user/profile/a

当 Google 将我编入索引时。这意味着所有请求都将通过我的 IndexHandler 来决定如何处理它。

在 IndexHandler 内部,我想以某种方式获取处理“/user/profile/a”的类,这样我就可以在其上调用特殊方法,返回页面的完整 HTML(不是部分)。

伪代码看起来像这样:

 class IndexHandler(webapp2.RequestHandler):

    def get(self):

        # In my example this would return 'user/profile/a'
        fragment = self.request.GET.get('_escaped_fragment_', '')

        if fragment:
            fragment = '/' + fragment

            # This is something I have no idea how to do
            clas_Im_looking_for = XXXX(fragment).get_handler()

            response = webapp2.Response()
            handler = clas_Im_looking_for(request, response)

            # Fragment get is my method
            response = handler.fragment_get()

谢谢!

【问题讨论】:

标签: python webapp2


【解决方案1】:

我不是 SEO 专家,但我建议使用 301 重定向将传入请求重定向到“友好 URL”。通过这种方式,您可以确保漂亮的 URL 被编入索引,因此任何找到您的站点的人也将使用那里的 URL 来访问您的应用程序。

您应该确保这些 URL 以对用户有意义的方式响应...

这也解决了您分配正确的处理程序来处理 URL 的问题。你的应用程序知道如何做到这一点。由于您现在处于应用程序的特定处理程序中,因此您实际上是深入了解路由的级别。

可能有一种方法可以在处理程序代码中使用self.app 来反向引用顶级应用程序对象,或者使用webapp2.get_app() 之类的东西来获取应用程序对象,然后使用路由器来匹配正确的处理程序(记录here)

但是重定向解决方案更优雅:

class IndexHandler(webapp2.RequestHandler):

    def get(self):

        # In my example this would return 'user/profile/a'
        fragment = self.request.GET.get('_escaped_fragment_', '')

        if fragment:
            fragment = '/' + fragment
            self.redirect(fragment, permanent=True) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多