【问题标题】:Django views error when deployedDjango 在部署时查看错误
【发布时间】:2015-05-02 09:40:52
【问题描述】:

我在我的开发机器上修改了以下方法,它在那里工作得很好:

def profile_search(request):
    args = {}
    qs=[]
    if request.method == 'GET':        
        page = request.GET.get('page')
        print 'page is:' + str(page)
        if 'search-profiles-post' in request.session: 
            request.POST = QueryDict('').copy()
            request.POST.update(request.session['search-profiles-post'])            
            request.method = 'POST' 


    if request.method == "POST":
        form = AdvancedSearchForm(request.POST)
        request.session['search-profiles-post'] = request.POST


        if form.is_valid():
            cd = form.cleaned_data

            s_country=cd['country']
            s_province=cd['province']
            s_city = cd['city']

            if s_country: qs.append(Q(country__icontains = s_country))
            if s_province: qs.append( Q(province__icontains=s_province))             
            if s_city: qs.append( Q(city__icontains=s_city))




            f = None
            for q in qs:
                if f is None: 
                    f=q                                  
                else: f &=q
            print f

            if f is not None:
                profiles = UserProfile.objects.filter(f).order_by('-created_at') 


        else:
            form = AdvancedSearchForm()
            profiles = UserProfile.objects.all().order_by('-created_at') 

    paginator = Paginator(profiles,12) # << This line is problematic

    page= request.GET.get('page')
    try:
        results = paginator.page(page)
    except PageNotAnInteger:
        results = paginator.page(1)  

    except EmptyPage:
            results = paginator.page(paginator.num_pages)        

    args.update(csrf(request))    
    args['form'] = form  
    args['results'] = results
    return render_to_response('userprofile/advanced_search.html', args,
                              context_instance=RequestContext(request)) 

但是,当我将视图复制到我的产品中时(在修改之前工作正常),我收到了这个错误:

UnboundLocalError at /search/
local variable 'profiles' referenced before assignment

追溯:

File "/root/.djenv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "./userprofile/views.py" in profile_search
  739.     paginator = Paginator(profiles,12)

Exception Type: UnboundLocalError at /search/
Exception Value: local variable 'profiles' referenced before assignment

据我所知,我的生产和开发之间唯一不同的代码是 settings.py(它使用不同的数据库)。

由于搜索查询要保存到会话中,我怀疑它与生产中的会话处理有关,但我不知道如何。

可能相关的一点:虽然我在生产机器上安装了调试工具栏,但即使在调试模式下我也看不到它的选项卡。

感谢您提供解决此问题的提示。

【问题讨论】:

  • 存在未定义profiles变量的执行路径。表单有效且 f 为无。
  • @eugene 不确定这与开发和生产之间的不同行为有何关系。
  • 例如,您的 qs 在 prod 中是空的,而不是在 dev 中。
  • @eugene 那么你有什么建议可以避免这个问题?
  • 好吧,我只是指出了您问题的原因之一。如何解决它是..你应该准备好处理所有的执行路径?

标签: django django-deployment


【解决方案1】:

您的问题是 profiles 变量未在生产中定义。

有一个代码路径没有定义您的 profiles 变量。

仔细观察,您应该能够理解为什么会发生这种情况。

您的qs 可能为空,您假设request.method 必须是get or post 可能是错误的。 (客户端可能会发送补丁、删除请求)。可能还有更多原因...

在任何情况下,您的代码都有未定义profiles 变量的漏洞,并且您的生产服务器(或使用该服务器的客户端)在某种意义上是不同的,因为它正在通过不同的执行路径。

您可以输入import pdb; pdb.set_trace() 并对其进行调试。 或精神分析您的代码以修复它。

【讨论】:

    【解决方案2】:

    放置或复制

    分页器 = 分页器(profiles,12)

    profiles = UserProfile.objects.filter(f).order_by('-created_at')

    具有相同的缩进。我认为 f 的值不是 None,并且基于显示的代码,您的分页在 profile_search() 之外,所以我认为 profilles 的分配失败。

    【讨论】:

      猜你喜欢
      • 2018-05-30
      • 2021-05-13
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多