在不包含URL的情况下将表单POST值从一个视图传递到另一个视图

时间:2019-02-23 14:34:06

标签: django django-views

我正在建立一个项目,要求用户输入另一个站点的用户名和密码。我的想法是数据将存储在会话中。我不需要将用户名和密码存储在数据库中。

无论如何,当我提示用户输入他们的姓名并通过表格传递时...

urls.py

from django.urls import path

from . import views

app_name = 'main'

urlpatterns = [
    path('', views.enteruser, name='enteruser'),
    path('success/', views.success, name='success'),
    path('<str:username>/', views.home, name='home'),
]

views.py

def enteruser(request):
if request.method == 'POST':
    form = EnterUserForm(request.POST)
    username = request.POST['username']
    password = request.POST['password']
    if form.is_valid():
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        request.session['username'] = username
        request.session['password'] = password
        form.save()
    return redirect('main:home', username=username, password=password)
else:
    if request.session.session_key:
        username = request.session['username']
        password = request.session['password']
        return redirect('main:home', username=username, password=password)
    else:
        form = EnterUserForm()
        return render(request, 'main/enteruser.html', {'form': form})

forms.py

class EnterUserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)
    class Meta:
        model = DuolingoUsers
        fields = ['username', 'password']
        labels = {
            'username': 'Enter Duolingo Username:',
            'password': 'Enter Duolingo Password:',
        }

models.py

class DuolingoUsers(models.Model):
    username = models.CharField(max_length=100, unique=True)
    last_update = models.DateField(blank=True, null=True)
    last_inquiry = models.DateField(auto_now=True)

...如何在不暴露URL中数据的情况下将其传递到后续视图main:home中?

编辑:我尝试过类似的操作:

def home(request, username=None, password=None):
    template_name = 'main/index.html'
    if username is None or password is None:
        if request.session.session_key:
            username = request.session.get('username', None)
            password = request.session.get('password', None)

但是我在会话中遇到字典错误,而且我不完全确定这是一个好方法。

1 个答案:

答案 0 :(得分:0)

您可以通过Cookies进行加密设置。 或者,如果您要抓取,为什么不登录,然后将duolingo的cookie保存到数据库中,并为duolingo cookie分配唯一的标识符。

例如,您可以创建以下模型表

class DuolingoCookies(models.Model):
    uniqueIdentifier = models.CharField(max_length=128)
    cookies = models.TextField()
    created_at = models.DateTimeField(auto_created=True)

然后将uniquidentifier分配给唯一的cookie。使用该信息检索并登录duolingo。 让我知道是否有帮助。

有关设置Cookie的信息,请参见reference。当然,您需要改进分配,也可以为DuolingoCookies分配一个user_id,以便只能通过Users ::

进行访问。