Django中GET返回304,列出条目时测试失败
在我的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 个回答
你可能对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'
。
希望这个解释能帮你理清思路。