#python #django #caching
#python #django #кэширование
Вопрос:
В моем приложении Django я получаю список проектов в нашей облачной организации Google со следующим:
try:
global projectdicts
projectdicts = cloudresmanv1.projects().list().execute()
projectdicts = projectdicts.get('projects')
except Exception as e:
logging.error(e)
Приведенное выше взято из формы Django под названием ProjectForm.
Однако после того, как я создал проект GCP и снова перешел в своем приложении Django на страницу ProjectForm, список не обновляется, чтобы показать вновь созданный проект. Я понимаю, что она должна снова выполнить вышеуказанное, независимо.
Если я запускаю скрипт вручную, переменная projectdicts, конечно, обновляется. Итак, это наводит меня на мысль, что по какой-то причине приложение Django или Python кэширует переменную и не утруждает себя повторным запуском вышеупомянутого.
Это вероятная проблема? И если да, то как мне заставить Django / Python снова запустить эту часть скрипта, чтобы убедиться, что список проектов GCP обновляется всякий раз, когда я перехожу на страницу формы проекта?
Редактировать 09/09/2020: Вот полная форма, запрошенная в комментариях:
class ProjectForm(forms.Form):
client = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Client Name (lowercase)'}),validators=[RegexValidator(r'^[a-z] $', 'Enter a valid client name (only lowercase letters)')])
stage = forms.ChoiceField(choices=TYPES)
folder = forms.ChoiceField(choices=FOLDERS, required=False, label='')
purpose = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Project Purpose (lowercase; digit optional)'}),validators=[RegexValidator(r'^[a-z-] [1-9]?$', 'Enter a valid purpose (only lowercase letters, with a single optional digit)')])
computeapi = forms.BooleanField(required=True, initial=True, label='Compute Engine')
deploymentmanapi = forms.BooleanField(required=False, label='Deployment Manager')
storagecompapi = forms.BooleanField(required=False, label='Storage Components')
monitorapi = forms.BooleanField(required=False, label='Monitoring')
loggingapi = forms.BooleanField(required=False, label='Logging')
def clean(self):
form_data = super(ProjectForm, self).clean()
projectname = form_data['client'] "-" form_data['stage'] "-" form_data['purpose']
client = form_data['client']
purpose = form_data['purpose']
for projectdict in projectdicts:
if projectname == projectdict['name']:
raise ValidationError(projectname " already exists! Please try another name.")
if not re.match("^[a-z-] [1-9]?$", purpose):
raise ValidationError(purpose " does not comply with the Regex parameters.")
if not re.match("^[a-z] $", client):
raise ValidationError(client " does not comply with the Regex parameters.")
return form_data
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.add_input(Button('back', 'Back', css_class='button button--wide button--black', onclick="window.location.href = '{}';".format(reverse('home'))))
self.helper.add_input(Submit('next', 'Next', css_class='button button--wide button--white'))
self.helper.layout = Layout(
Fieldset(
'Project Name',
Row(
Column('client', css_class='form-group col-md-4 mb-0'),
Column('stage', css_class='form-group col-md-4 mb-0'),
Column('purpose', css_class='form-group col-md-4 mb-0'),
)
),
Fieldset(
'Folder Name',
Row(
Column('folder', css_class='form-group col-md-4 mb-0')
)
),
Fieldset(
'APIs To Enable',
Row(
Column('computeapi', css_class='form-group col-md-3 mb-0'),
Column('deploymentmanapi', css_class='form-group col-md-3 mb-0'),
Column('storagecompapi', css_class='form-group col-md-3 mb-0'),
Column('monitorapi', css_class='form-group col-md-3 mb-0'),
Column('loggingapi', css_class='form-group col-md-3 mb-0')
)
),
)
Комментарии:
1. возможно
global projectdicts
?2. Есть ли причина, по которой глобальная переменная кэшируется и не обновляется? Извините, я новичок в этом, и использование глобальной переменной, хотя, возможно, нелогичной, было единственным способом, которым я мог использовать ее в новом классе при очистке данных формы.
3. Не могли бы вы поделиться формой, пожалуйста? Или, по крайней мере, покажите, где объявлена и используется переменная.
4. Конечно, теперь это обновлено.