Django 应用视图中 urls.py 的正则匹配

0 投票
3 回答
679 浏览
提问于 2025-04-17 03:41

我想匹配的链接是:

http://domain/games/getdata/genres/

这个请求是通过ajax发出的,目的是从一个外部的api获取一些JSON数据。我一直没法让它匹配成功,总是跳到我设置的一个中间处理程序。我知道这个问题的解决办法应该很明显,但我盯着这个看太久了。

urls.py文件:

from django.conf import settings
from django.conf.urls.defaults import patterns, include
from django.contrib import admin


admin.autodiscover()

urlpatterns = patterns('',

    (r'^$', 'blog.views.index'),
    (r'^games/$', 'giantbomb_games.views.index'),
    (r'^games/getdata/(?P<resource>\w+)/$', 'giantbomb_games.views.getdata'),

    (r'^grappelli/', include('grappelli.urls')),
    (r'^admin/filebrowser/', include('filebrowser.urls')),
    (r'^admin/', include(admin.site.urls)),
)

views.py文件:

def getdata(request, resource):

    url = '%s/%s/?api_key=%s&format=%s' % (api_url, resource , api_key, request_format)
    print url
    r = requests.get(url)

    return r.content

page/middleware.py文件:

from django.http import Http404
from django.conf import settings

from page.views import site_page

class SitePageFallbackMiddleware(object):
    def process_response(self, request, response):
        if response.status_code != 404:
            return response # No need to check for a flatpage for non-404 responses.
        try:
            return site_page(request, request.path_info)
        # Return the original response if any errors happened. Because this
        # is a middleware, we can't assume the errors will be caught elsewhere.
        except Http404:
            return response
        except:
            if settings.DEBUG:
                raise
            return response

django错误信息:

Traceback (most recent call last):

  File "/var/www/html/top10/top10/../ext/django/core/servers/basehttp.py", line 280, in run
    self.result = application(self.environ, self.start_response)

  File "/var/www/html/top10/top10/../ext/django/core/servers/basehttp.py", line 674, in __call__
    return self.application(environ, start_response)

  File "/var/www/html/top10/top10/../ext/django/core/handlers/wsgi.py", line 245, in __call__
    response = middleware_method(request, response)

  File "/var/www/html/top10/top10/page/middleware.py", line 8, in process_response
    if response.status_code != 404:

AttributeError: 'str' object has no attribute 'status_code'

提前谢谢你。

3 个回答

1

这个getdata视图返回的是一个字符串,而不是一个HttpResponse对象。所以在中间件里的process_response处理的时候,接收到的是一个字符串,而字符串是没有status_code这个方法的。你需要把你的视图改成这样:

def getdata(request, resource):
    #...
    return HttpResponse(r.content, mimetype="text/plain")
1

我不太确定我是否理解你的意思……你是说你的视图没有被调用吗?

如果你设置了一些中间件类,那么在请求处理的过程中,正常情况下会先经过这些中间件,然后才会到达你的视图。

这里有一些文档可以参考:

https://docs.djangoproject.com/en/dev/topics/http/middleware/?from=olddocs

在你的中间件类里,你应该能看到哪个视图函数会被 URL 解析器调用,当它到达这个方法时:process_view(self, request, view_func, view_args, view_kwargs)

如果我没有完全理解你的问题,请告诉我。

0

我搞明白了。Django 实际上是正确地访问了视图。问题出在 api 上,因为从 getdata 视图发出的网址请求格式不对,导致了错误。真是我自己搞错了。

撰写回答