Python django中未定义全局变量

Python django中未定义全局变量,python,django,global-variables,sms,verify,Python,Django,Global Variables,Sms,Verify,我在django中的代码有问题 我定义了两个全局变量 但Django没有确认他们的身份 我的看法是: global phone,rand_num def phone_login(request): if request.method == 'POST': form = PhoneLoginForm(request.POST) if form.is_valid(): phone = f"0{form.cleaned_data

我在django中的代码有问题 我定义了两个全局变量

但Django没有确认他们的身份

我的看法是:

global phone,rand_num
def phone_login(request):
    if request.method == 'POST':
        form = PhoneLoginForm(request.POST)
        if form.is_valid():
            phone = f"0{form.cleaned_data['phone']}"
            rand_num = randint(1000, 9999)
            api = KavenegarAPI('mytoken!')
            params = { 'sender' : '', 'receptor': phone , 'message' : rand_num }
            api.sms_send(params)
            return redirect('account:verify')

    else :
        form = PhoneLoginForm()
    return render(request,'account/phone_login.html',{'form':form})


def verify(request):
    if request.method == "POST":
        form = VerifyCodeForm(request.POST)
        if form.is_valid():
            if rand_num == form.cleaned_data['code']:
                profile = get_object_or_404(Profile, phone = phone)
                user = get_object_or_404(User,profile__id = profile.id)
                login(request,user)
                messages.success(request,'logged in successfully' , 'success')
                return redirect('popasssts:all_posts')
            else:
                messages.error(request,'your code is wrong','warning')
                
    else:
        form = VerifyCodeForm()
    return render(request,'account/verify.html',{'form' : form})
我的网址:

path('verify/',views.verify,name='verify'),
我有一个错误:

NameError at /account/verify/

name 'rand_num' is not defined

Request Method:     POST
Request URL:    http://127.0.0.1:8000/account/verify/
Django Version:     3.0.7
Exception Type:     NameError
Exception Value:    

name 'rand_num' is not defined


我希望用户在输入SMS代码后进入站点。

注意:全局变量可能违反了编程最重要的原则,即封装。使用它们,将把你的代码变成意大利面条。不要使用它们。(除非另有办法)

以下是封装的含义:

…封装是指将数据与操作该数据的方法捆绑在一起,或限制对对象某些组件的直接访问

资料来源:

如果您真的想使用它,那么您的问题是:
global
关键字应该在函数中使用

让我们这样试试:

phone=“”
rand_num=0
def phone_登录(请求):
全球电话
如果request.method==“POST”:
...
def验证(请求):
全球电话
如果request.method==“POST”:
...

关于全局变量,您需要将
global
关键字放在函数内部,并将初始值分配给外部变量:

phone=“”
rand_num=-1
def phone_登录(请求):
全球电话
# ...
def验证(请求):
全球电话
# ...
通过这种方法,
phone
rand_num
的值在应用程序的所有用户之间共享。如果应用程序有多个用户,更好的方法是将值存储在当前用户的会话中:

def phone_登录(请求):
如果request.method==“POST”:
# ...
如果form.is_有效():
# ...
#在会话中保存值
请求。会话[“电话”]=电话
request.session[“rand\u num”]=rand\u num
# ...
def验证(请求):
如果request.method==“POST”:
# ...
如果form.is_有效():
#从会话中获取值,设置
#默认值,以防它们不存在。
phone=request.session.get(“phone”,“”)
rand_num=request.session.get(“rand_num”,-1)
# ...
要使用会话,必须在django项目的settings.py文件的
INSTALLED_APPS
列表中启用
django.contrib.sessions
应用程序。此外,必须使用命令
python manage.py migrate
将此应用程序迁移到项目的数据库中


在官方版本中,您有关于会话的更多信息。

您的代码不是线程安全的。想象一下,它可以工作,然后每个新用户都会为每个仍在进行的验证重置代码。不要在web应用程序中使用全局变量,而是使用。非常感谢您的指导和建议