Python Django,在获取令牌后,在页面打开后运行代码/重新呈现
我正在Django中构建一个应用程序,该应用程序使用一个表单,该表单需要从API中收集一些数据。使用该API进行身份验证的令牌是通过使用登录流收集的。但是,当令牌过期时,Django拒绝运行,因此无法通过重新身份验证刷新令牌 是一种在登录后从表单运行代码的方法,这样Django就不会在启动时尝试运行它。或在打开/刷新页面时重新呈现表单 但是,此表单需要来自该API的一些数据。要访问这个API,我需要使用一个令牌,这个令牌是通过进入应用程序开头的登录流获得的,然后登录流将令牌存储在应用程序中使用。但是,当令牌过期时,Django将不会启动。因此,要实现登录流以获取新令牌是不可能的 我正在使用Microsoft graph API并请求AzureAD提供数据 我已尝试将表单的部分放置在Try中:除了: 这是可行的,但是它不会在刷新或重新打开包含表单的页面时重新加载正确的信息 表格:Python Django,在获取令牌后,在页面打开后运行代码/重新呈现,python,django,django-forms,token,Python,Django,Django Forms,Token,我正在Django中构建一个应用程序,该应用程序使用一个表单,该表单需要从API中收集一些数据。使用该API进行身份验证的令牌是通过使用登录流收集的。但是,当令牌过期时,Django拒绝运行,因此无法通过重新身份验证刷新令牌 是一种在登录后从表单运行代码的方法,这样Django就不会在启动时尝试运行它。或在打开/刷新页面时重新呈现表单 但是,此表单需要来自该API的一些数据。要访问这个API,我需要使用一个令牌,这个令牌是通过进入应用程序开头的登录流获得的,然后登录流将令牌存储在应用程序中使用。
sign_in()
infile = open('token.pickle', 'rb')
token = pickle.load(infile)
infile.close()
depDict = get_deps(token)
depDict = [(v, k) for k, v in depDict.items()]
except:
pass
class userCreationForm(forms.Form):
firstName = forms.CharField(label='First name', max_length=100, widget=forms.TextInput(attrs={'class': 'form-controll', 'type': 'text', 'placeholder': 'First Name'}))
lastName = forms.CharField(label='Last name', max_length=100, widget=forms.TextInput(attrs={'class': 'form-controll', 'type': 'text', 'placeholder': 'Last Name'}))
email = forms.EmailField(label='email', max_length=100, widget=forms.EmailInput(attrs={'class': 'form-controll','type': 'email', 'placeholder': 'Email adress'}))
try:
department = forms.CharField(label='department', widget=forms.Select(choices=depDict, attrs={'class': 'form-controll'}))
except:
department =forms.CharField(label='department', widget=forms.Select(choices=[('DEP-Everyone','DEP-Everyone')], attrs={'class': 'form-controll'}))
观点:
user_create_form = userCreationForm
if request.method == 'POST':
form = user_create_form(request.POST)
if form.is_valid():
messages.info(request, 'User will be created')
form = user_create_form()
# first_name = user_create_form.firstName
# last_name = user_create_form.lastName
# UPN = user_create_form.email
# password = "test123!"
else:
form = userCreationForm()
return render(request, 'user_creation_page.html', {'form': form})
将
部门
字段的创建移动到表单的\uuuu init\uuuu()方法中。现在它处于类级别,当导入表单时(当Django启动时),已经创建了类,包括运行API调用。如果您将其移动到\uuuuuu init\uuuuuuuu
,它将在每次实例化表单时运行。您好,我已经这样做了,现在看起来如下所示:def\uuuuu init\uuuuuu(self):try:department=forms.CharField(label='department',widget=forms.Select(choices=depDict,attrs={class':'form controll'}))除了:department=forms.CharField(label='department',widget=forms.Select(choices=[('DEP-Everyone','DEP-Everyone')],attrs={'class':'form controll'}))
。页面是这样的。在表单的init方法中创建字段时,不能只创建变量department
,因为它在退出init方法后将丢失。self.fields['department']=…
是将字段“department”添加到表单的方式。还要确保在init内部创建depDict
(或使其可调用,即返回dict的函数),以便在每次创建表单时运行该函数。这就是问题的关键所在。我已经向depDict请求了一个被调用的函数。并修改了语法。然而,它仍然没有渲染任何东西,我完全不知所措。我真的不明白如何告诉Django应用程序的其余部分department字段位于何处,因为init
方法没有返回任何内容。现在看起来是这样的self.fields['department']=forms.CharField(label='department',widget=forms.Select(choices=get\u depDict(),attrs={'class':'form controll'}))
将department
字段的创建移动到表单的\u init\uu()方法中。现在它处于类级别,当导入表单时(当Django启动时),已经创建了类,包括运行API调用。如果您将其移动到\uuuuuu init\uuuuuuuu
,它将在每次实例化表单时运行。您好,我已经这样做了,现在看起来如下所示:def\uuuuu init\uuuuuu(self):try:department=forms.CharField(label='department',widget=forms.Select(choices=depDict,attrs={class':'form controll'}))除了:department=forms.CharField(label='department',widget=forms.Select(choices=[('DEP-Everyone','DEP-Everyone')],attrs={'class':'form controll'}))
。页面是这样的。在表单的init方法中创建字段时,不能只创建变量department
,因为它在退出init方法后将丢失。self.fields['department']=…
是将字段“department”添加到表单的方式。还要确保在init内部创建depDict
(或使其可调用,即返回dict的函数),以便在每次创建表单时运行该函数。这就是问题的关键所在。我已经向depDict请求了一个被调用的函数。并修改了语法。然而,它仍然没有渲染任何东西,我完全不知所措。我真的不明白如何告诉Django应用程序的其余部分department字段位于何处,因为init
方法没有返回任何内容。现在看起来是这样的self.fields['department']=forms.CharField(label='department',widget=forms.Select(choices=get\u depDict(),attrs={'class':'form controll'}))