Python django中未定义全局变量
我在django中的代码有问题 我定义了两个全局变量 但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
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应用程序中使用全局变量,而是使用。非常感谢您的指导和建议