GET在django中显示304,并且在列出条目时测试失败

时间:2011-09-04 13:22:18

标签: python django unit-testing get

在我的django应用程序中,我正在使用css文件和一些图像用于我的网页。我已将media_root和media_url定义为

在settings.py

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',
)

媒体文件夹包含

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响应代码。 (我使用的是django1.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上的GET和图像返回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上的print打印'None',并在尝试response.context ['entries']时引发类型错误

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

我无法弄清楚为什么会这样。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分: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_meda/或将MEDIA_ROOT更改为'/home/me/dev/python/django/myproject/mysite/media/myapp

希望这个解释能为你解决问题。