2016-02-11 2 views
0

Я пытаюсь вызвать внешний api из представления, основанного на классе. В настоящее время у меня есть представление ниже, которое вызывает API. Однако на данный момент я просто вызываю API с api(username, password), и он возвращает данные, но не сохраняет их.django вызов внешний api из вида

Как я могу передать модель, используемую в modelform в представлении, для функции api, чтобы она могла сохранять возвращенные данные соответствующему пользователю. (то есть, какой метод мне нужно переопределить в CBV).

Дополнительный лучший способ для вызова внешнего api в django (для инициализации по завершению формы). В настоящее время поездка по API проходит через 5-10 секунд, что в настоящий момент, как она настраивается, задерживает загрузку следующей страницы на эту сумму.

class SupplierOnlineAccountView(CreateView): 
    form_class = SupplierOnlineAccountForm 
    template_name = 'standard_form.html' 
    success_url = '../contacting' 

    def form_valid(self, form): 
     username = form.cleaned_data.get('username') 
     password = form.cleaned_data.get('password') 
     api(username, password) 
     return super().form_valid(form) 

Модель:

class EUser(models.Model): 
    username = models.CharField(max_length=255, null=True) 
    password = models.CharField(max_length=255, null=True) 
    address = models.ForeignKey(Address, null=True) 
    temp_user = models.CharField(max_length=255, null=True) 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, null=True, default=None) 
    title = models.CharField(max_length=10) 
    first_name = models.CharField(max_length=255) 
    last_name = models.CharField(max_length=255) 
+0

Можете ли вы уточнить, что именно вы хотите сделать: какие данные у вас есть, где вы хотите его сохранить –

+0

Несомненно, я пытаюсь сохранить возвращенные данные api в модели Euser. Модель ProviderOnlineAccountForm также сохраняет модель Euser. Api возвращает first_name, last_name и т. Д. И другие данные, которые будут сохранены в модели EUser. – Yunti

+0

ОК, обновленный ответ. –

ответ

1
def form_valid(self, form): 
    username = form.cleaned_data.get('username') 
    password = form.cleaned_data.get('password') 
    self.object = form.save() 
    api(username, password,self.object) 
    return super().form_valid(form) 

Вы должны изменить название, first_name, last_name поля пустой = True, так что вы можете сэкономить до вызова API, а затем передать сохраненную модель ,

Проблема времени ожидания для API, это типичная асинхронная задача для очереди, например, сельдерея. Вы сохраняете форму, затем выгружаете задачу в очередь, которая выполняется на другом потоке (или процессе или машине). Тогда django не должен ждать, пока api вернется, и отправит ответ.

+0

Спасибо, теперь я вижу это в ModelFormMixin. Есть ли способ не сохранить первый, но все равно передать объект, который нужно сохранить, например, 'instance = form.save (commit = False)' в представлениях, основанных на функции? Я бы предпочел не ставить пустую = True во все поля, которые сохранит api, так как в конце концов, вероятно, будет много. – Yunti

+0

Вы можете, но лучше сначала сохранить db, особенно перед тем, как перейти к внешнему api. –

+0

Просто для того, чтобы понять, почему лучше сначала сэкономить, прежде чем отправиться в api? – Yunti

 Смежные вопросы

  • Нет связанных вопросов^_^