首页 > 解决方案 > Django 变量处理——为什么会这样?

问题描述

我对 django 很陌生,在我创建的这个 views.py 文件中遇到了一些让我感到困惑的东西。我只是玩了一下,想出了一些可行的方法,但我不明白为什么会这样。

Draft_Order 类(我在另一个文件中有)请求 NBA 统计页面,在后端执行一些计算,并输出选秀彩票赔率(新选秀)。初始化、模拟草稿和获取排名的方法都在后端完成(完美运行)。

现在,我的问题是我不明白为什么我可以在所有函数之外创建类 DraftOrder 的实例“f”,但仍然能够在我的大多数函数中引用它,因为它们是从我的urls.py 文件,所以看起来它们根本不应该工作。此外,由于某种原因,如果我在函数中没有对 f 的赋值,更新函数只能引用“f”——例如,如果我添加了该行

f = temp 

然后突然之间它给了我一个“unboundlocalerror”,并说 f 在分配之前被引用。

我很感激这方面的任何帮助。谢谢。

from django.shortcuts import render
from django.http.response import HttpResponse
from simulator.draft_simulator import Draft_Order
from simulator.models import Order

# Create your views here.
f = Draft_Order()
f.initialize()

def index(request):
    return HttpResponse('<p>Hello World</p>')

def init(request):
    return HttpResponse(f.initalodds.to_html())

def table(request):
    f.sim_draft()
    return HttpResponse(f.finaltable.to_html())

def update(request):
    temp = Draft_Order()
    temp.get_standings()
    if temp == f:
        return HttpResponse('Same!')
    else:
        return HttpResponse('updated!')

标签: pythondjangopython-3.x

解决方案


发生 UnboundLocalError 是因为函数内部存在对整个函数f的全局赋值。f您需要明确声明f引用全局变量:

def update(r):
    global f
    if f == ...
    f = Draft_Order()  # new draft order

但实际上,您不应该依赖存储在 RAM 中的全局值,因为在生产环境中,您将拥有几个可能具有不同fs 的进程,并且您将无法控制所述进程的生命周期。最好在这里依赖持久内存(数据库、键值存储、文件等)。


推荐阅读