金字塔登录和注销页面返回404,应用程序的其余部分工作正常

时间:2014-03-16 01:25:02

标签: python pyramid

我是金字塔的新手,我正在遵循这个指南: http://docs.pylonsproject.org/projects/pyramid/en/latest/tutorials/wiki2/authorization.html

在Django中,视图和URL要么工作要么崩溃了,但是我从来没有遇到过在views.py和urls.py中明确定义的网页会出现404错误的情况,这从来没有发生在我身上。如果其中任何一个出现问题,它都会崩溃,而不会抛出404。

我正在建立一个维基页面以获取金字塔上的东西,但在我继续学习本教程之前,我已经碰壁了。

我的 init .py文件设置如下:

def main(global_config, **settings):

    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    Base.metadata.bind = engine

    authn_policy = AuthTktAuthenticationPolicy(
        'sosecret', callback=groupfinder, hashalg='sha512')
    authz_policy = ACLAuthorizationPolicy()

    config = Configurator(settings=settings,
                          root_factory='tutorial.models.RootFactory')

    config.set_authentication_policy(authn_policy)
    config.set_authorization_policy(authz_policy)

    config.include('pyramid_chameleon')
    config.add_static_view('static', 'static', cache_max_age=3600)
    config.add_route('view_wiki', '/')
    config.add_route('view_page', '/{pagename}')
    config.add_route('add_page', '/add_page/{pagename}')
    config.add_route('edit_page', '/{pagename}/edit_page')
    config.add_route('login', '/login')
    config.add_route('logout', '/logout')

    config.scan()
    return config.make_wsgi_app()

我的views.py文件设置如下:

@view_config(route_name='login', renderer='templates/login.pt')
@forbidden_view_config(renderer='templates/login.pt')
def login(request):
    login_url = request.route_url('login')
    referrer = request.url
    if referrer == login_url:
        referrer = '/' # never use the login form itself as came_from
    came_from = request.params.get('came_from', referrer)
    message = ''
    login = ''
    password = ''
    if 'form.submitted' in request.params:
        login = request.params['login']
        password = request.params['password']
        if USERS.get(login) == password:
            headers = remember(request, login)
            return HTTPFound(location = came_from,
                             headers = headers)
        message = 'Failed login'

    return dict(
        message = message,
        url = request.application_url + '/login',
        came_from = came_from,
        login = login,
        password = password,
        )

@view_config(route_name='logout')
def logout(request):
    headers = forget(request)
    return HTTPFound(location = request.route_url('view_wiki'),
                     headers = headers)

到目前为止,应用程序运行良好,但登录和注销完全无效。我应该至少得到一个堆栈跟踪崩溃,但我刚刚给出404错误...

我关闭了应用程序并重新pserve development.ini --reload并且没有......他们只是不在那里......

我把它放在我的网址中:

  

0.0.0.0:6446/FrontPage < == WORKS

     

0.0.0.0:6446/login < == 404 Not Found,无法找到资源。没有这样的页面

我不确定如何调试声称不存在的东西......可能是什么问题?我将所有模板保存在同一个位置,我将edit_page视图与登录视图进行比较,它们非常相同,但登录显然不存在....为什么?

5 个答案:

答案 0 :(得分:4)

尝试在/{pagename}之前登录。这个路线系统在遇到第一场比赛时停止并处理此事。反转所有其他页面以静态字符串开头(例如:/foo

config.add_route('login', '/login')
config.add_route('logout', '/logout')
config.add_route('add_page', '/add_page/{pagename}')
config.add_route('view_page', '/{pagename}')
config.add_route('edit_page', '/{pagename}/edit_page')

答案 1 :(得分:2)

有时,当函数名称相同时会发生此问题,这通常发生在我们复制粘贴一段代码并对其进行编辑时。

比如说

登录视图

@view_config(route_name='login', renderer='templates/login.pt') 
@forbidden_view_config(route_name='login')
def my_view(request):

主页

@view_config(route_name='home', renderer='templates/mytemplate.pt')
def my_view(request):

答案 2 :(得分:1)

要进行调试,请尝试使用proutes from the commandline。它会告诉你金字塔找到了什么路线。 另一个很好的选择是use/enable pyramid_debugtoolbar来调试应用程序的任何方面。

答案 3 :(得分:1)

检查以确保您的方法或类名(无论您使用哪个)不重复。我收到此错误,原因是复制/粘贴方法而未更改其 def 名称。

例如:

@view_config(route_name='login')
def logout(request):
    pass

@view_config(route_name='logout')
def logout(request):
    pass

会失败。

答案 4 :(得分:0)

我发生了同样的事情。我认为对我来说,我没有/目录,但你似乎已经覆盖了这个目录。所以也许你的wiki_view没有正确设置。

另外,

- 确保视图收到请求 - 确保在文件开头导入所有必需的包。

这为我解决了