我已将我的Django网站上传到Digital Ocean的开发服务器上,并开始使用apache2和mod_wsgi提供服务。我也使用apache2来提供静态内容。它是服务器上Debian的全新安装,并且做了很少的更改。
我正在使用Django Haystack和Solr来支持全文搜索。我已经检查过数据库和Solr都是最新的。
现在,如果我用来检索页面的网址包含一个查询字符串(它可以小到?asd
,其中asd
不是一个有效的参数),一切都很好。
但是,如果它不包含这样的查询字符串,我会得到一个可能是几个小时(几天?)的页面版本,甚至包含我从数据库中删除的项目。
一旦我重新启动apache2,问题就解决了。
执行apache2ctl -M | grep cache
不返回任何内容,settings.py
也不引用缓存。任何人都知道这可能是什么原因?
更新:我的观点是标准搜索视图:
class SearchView(SearchView):
form_class = ArticleSearchForm
template_name = 'articles/index.html'
paginate_by = 5
def get_queryset(self):
queryset = super(SearchView, self).get_queryset()
return queryset
def get_context_data(self, *args, **kwargs):
context = super(SearchView, self).get_context_data(*args, **kwargs)
context['ctx'] = context
context['articles'] = map(lambda o: o.object, context['object_list'])
return context
以及相关的搜索表单:
class ArticleSearchForm(SearchForm):
start_date = forms.DateField(required=False, widget=forms.DateInput(attrs={ 'id': 'start_date', 'class': 'form-control' }))
end_date = forms.DateField(required=False, widget=forms.DateInput(attrs={ 'id': 'end_date', 'class': 'form-control'}))
def __init__(self, *args, **kwargs):
super(ArticleSearchForm, self).__init__(*args, **kwargs)
self.fields['q'].widget.attrs['class'] = 'form-control'
def search(self):
sqs = super(ArticleSearchForm, self).search()
if not self.is_valid():
return self.no_query_found()
if not self.cleaned_data.get('q'):
sqs = self.searchqueryset.all()
if self.cleaned_data['start_date']:
sqs = sqs.filter(pub_date__gte=self.cleaned_data['start_date'])
if self.cleaned_data['end_date']:
sqs = sqs.filter(pub_date__lte=self.cleaned_data['end_date']+datetime.timedelta(days=1))
return sqs
但是考虑到我得到的页面与数据库中的内容不一致,我根本不认为我的代码会被调用。
更新2:它比这更怪异。 有时在我的浏览器上点击刷新后,我得到了正确的结果。几次再次刷新我再次得到不正确的结果。我尝试在服务器上搜索页面(通过localhost),我得到不正确的结果。