Django中GET返回304,列出条目时测试失败

0 投票
1 回答
1014 浏览
提问于 2025-04-17 01:23

在我的Django应用中,我使用了一个CSS文件和一些图片来制作网页。我在settings.py中定义了media_root和media_url,如下所示:

MEDIA_ROOT = '/home/me/dev/python/django/myproject/mysite/media/'
MEDIA_URL = '/site_media/myapp/'
ADMIN_MEDIA_PREFIX = '/media/'
TEMPLATE_DIRS = (
'/home/me/dev/python/django/myproject/mysite/myapp/myapptemplates',
)

media文件夹里包含了:

myapp/css and myapp/img folders 

base.html的完整路径是:

/home/me/dev/python/django/myproject/mysite/myapp/myapptemplates/myapp/base.html

在上面的base.html中,我是这样放置CSS和图片的:

<head>
<title>myapp</title>
<LINK REL=StyleSheet HREF="{{MEDIA_URL}}css/mystyle.css" TYPE="text/css" MEDIA="screen, print"/>
<link rel="shortcut icon" href="{{ MEDIA_URL }}img/my-icon.ico"/>
<div id="header">
    <img class="centerpage" src="{{ MEDIA_URL }}img/mypic.gif" alt="MY WEB APP PIC">
 </div>

当我尝试列出我在应用中创建的所有条目时,一切都显示得很正常。但我注意到在获取CSS和图片时,返回了304的响应代码。(我使用的是Django 1.1.1,所以在模板中没有使用任何csrf_token。)Django在终端输出的信息是:

[04/Sep/2011 18:15:18] "GET /myapp/entries/ HTTP/1.1" 200 3843
[04/Sep/2011 18:15:18] "GET /site_media/myapp/css/mystyle.css HTTP/1.1" 304 0
[04/Sep/2011 18:15:18] "GET /site_media/myapp/img/mypic.gif HTTP/1.1" 304 0
[04/Sep/2011 18:15:18] "GET /site_media/myapp/img/navigation1.png HTTP/1.1" 304 0

如你所见,视图返回了200,而获取CSS和图片时返回了304。不过,网页上的样式和图片显示得都很正常。

另外,可能相关的一个问题是,当我测试以下视图时,它失败了。

@login_required
def entries_list(request,template_name,page_title):
    entries=get_entries_of_user(request.user)
    dict={'page_title':page_title ,'entries':entries}
    req_context=RequestContext(request,dict)
    return render_to_response(template,req_context)   

 class BaseTestCase(TestCase):
    def setUp(self):
      super(BaseTestCase,self).setUp()
      self.client.login(username='me',password='me')
 class EntryTest(BaseTestCase):
   fixtures=['entries.json']
   def test_entries_list_view(self):
       print 'reverse=',reverse('myapp_entry_list')
       response=self.client.get(reverse('myapp_entry_list'))
       status_code=response.status_code
       print 'st code=',status_code
       entries=get_context_variable(response,'entries')
       self.assertEqual(200,status_code)

   def get_context_variable(response,name):
      print 'response_context=',response.context
      return response.context[name]

这里打印的状态码是:

st code= 302

打印response.context时显示为'None',当尝试访问response.context['entries']时引发了类型错误。

in get_context_variable
    return response.context[name]
TypeError: 'NoneType' object is unsubscriptable

我搞不清楚为什么会这样。有人能帮我吗?

1 个回答

0

你可能对MEDIA_URL是怎么使用MEDIA_ROOT定义的绝对路径感到困惑。

当你请求 '/site_media/myapp/' 时,它会查看MEDIA_ROOT的顶层目录(在这个例子中是 '/home/me/dev/python/django/myproject/mysite/media/')。如果你请求 /site_media/myapp/css/mystyle.css,那么它会去找MEDIA_ROOT/css/mystyle.css,这样就变成了: '/home/me/dev/python/django/myproject/mysite/media/css/mystyle.css'。你可以选择把MEDIA_URL改成 /site_media/,或者把MEDIA_ROOT改成 '/home/me/dev/python/django/myproject/mysite/media/myapp'

希望这个解释能帮你理清思路。

撰写回答