【问题标题】:How to redirect properly in Django URL , I am having issue in redirecting如何在 Django URL 中正确重定向,我在重定向时遇到问题
【发布时间】:2020-09-18 05:09:33
【问题描述】:
  • 遇到重定向问题,我在我的网站上的注册页面(“帐户/注册”),如果有人注册,则验证码将发送到他的电子邮件 ID 并验证我们有一个 url “帐户/验证”。但是当我尝试注册它时,它会注册一个用户,但不会将其发送到“accounts/verify”,而是将其发送到“accounts/register/accounts/verify”,

  • 另外请让我知道如何使用用户电子邮件地址,同时将他注册到数据库中。我只是想让他的电子邮件ID发送验证码。

这是我的应用的 URL.py:

from django.contrib import admin
from django.urls import path,include
from . import views
from django.contrib.auth.models import User

    urlpatterns = [
        path('login/', views.login, name='Login-Page'),
        path('register/', views.register, name='Registeration-page'),
        path('logout/', views.logout),
        path('verify/', views.verify, name='verification page')

这是我的 View.py 用于注册和配置文件:

from django.shortcuts import render, redirect
import requests
from django.contrib.auth.models import User, auth
from django.contrib import messages
from datetime import date
import smtplib
import random
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

def register(request):

    if request.method == 'POST':
        first_name = request.POST['first_name']
        last_name = request.POST['last_name']
        username = request.POST['username']
        email = request.POST['email']
        password1 = request.POST['password1']
        password2 = request.POST['password2']

        if password1==password2:
            if User.objects.filter(username=username).exists():
                messages.info(request, "Username already taken")
                return redirect('accounts/register')
            elif User.objects.filter(email=email).exists():
                messages.info(request, "email already taken")
                return redirect('accounts/register')
            else:
                user = User.objects.create_user(username=username, password=password1, email=email, first_name=first_name, last_name=last_name)
                user.save();  
                return redirect('accounts/verify') # 'accounts/login'
        else:
            messages.info(request,"password not matched")
            return redirect('accounts/register')

    else:
        return render(request, 'register.html')


def verify(request):
    if request.method == 'POST':
        sender_address = 'xyz@gmail.com'
        sender_pass = 'password'
        user_email = register.user.objects.email
        receiver_address = user_email
        passd = random.randrange(111111,10000000,39)
        mail_content = "Hello This is your verficatiob code   " + str(passd)

        def check(code):
            if code==passd:
                return redirect('accounts/login')
            else:
                messages.info(request,"Code is incorrect")
                return redirect('accounts/verify')


        message = MIMEMultipart()
        message['From'] = sender_address
        message['To'] = receiver_address
        message['Subject'] = 'Verification Code'
        message.attach(MIMEText(mail_content, 'plain'))
        session = smtplib.SMTP(EMAIL_HOST, EMAIL_PORT)
        session.starttls()
        session.login(sender_address, sender_pass)
        text = message.as_string()
        session.sendmail(sender_address, receiver_address, text)
        session.quit()
        print('Mail Sent')
        code = request.POST['code']

        check(code)
    else:
        return render(request, 'email_verify.html')

这是我的注册模板:

<div class="limiter">
        <div class="container-login100" style="background-image: url ('/images/bg-01.jpg');">
            <div class="wrap-login100 p-l-55 p-r-55 p-t-65 p-b-54">
                <form action="{{register}}" method="post">
                    {% csrf_token %}
                <!--<form class="login100-form validate-form">-->
                    <span class="login100-form-title p-b-49">
                        Registration
                    </span>
                    <div>
                    {% for message in messages %}
                    <input class="wrap-input validate-input m-b-23" data-validate="{{message}}">
                    {% endfor %}
                    </div>

                    <div class="wrap-input100 validate-input m-b-23" data-validate = "First name is reauired">
                        <span class="label-input100"><th>first name</th></span>
                        <input class="input100" type="text" name="first_name" placeholder="Type your First name">
                        <span class="focus-input100" data-symbol="&#xf206;"></span>
                    </div>
                    <div class="wrap-input100 validate-input m-b-23" data-validate = "Last name is reauired">
                        <span class="label-input100"><th>last name</th></span>
                        <input class="input100" type="text" name="last_name" placeholder="Type your Last name">
                        <span class="focus-input100" data-symbol="&#xf206;"></span>
                    </div>
                    <div class="wrap-input100 validate-input" data-validate="Username is required">
                        <span class="label-input100">Username</span>
                        <input class="input100" type="username" name="username" placeholder="Type your username">
                        <span class="focus-input100" data-symbol="&#xf190;"></span>
                    </div>
                    <div class="wrap-input100 validate-input" data-validate="email is required">
                        <span class="label-input100">email</span>
                        <input class="input100" type="email" name="email" placeholder="Type your email">
                        <span class="focus-input100" data-symbol="&#xf190;"></span>
                    </div>

                    <div class="wrap-input100 validate-input" data-validate="password is required">
                        <span class="label-input100">Password</span>
                        <input class="input100" type="password" name="password1" placeholder="Type your password">
                        <span class="focus-input100" data-symbol="&#xf190;"></span>
                    </div>
                    <div class="wrap-input100 validate-input" data-validate="confirm password is required">
                        <span class="label-input100">Confirm Password</span>
                        <input class="input100" type="password" name="password2" placeholder="Type your password Again">
                        <span class="focus-input100" data-symbol="&#xf190;"></span>
                    </div>
                    <br>
                    <div class="container-login100-form-btn">
                        <div class="wrap-login100-form-btn">
                            <div class="login100-form-bgbtn"></div>
                            <button class="login100-form-btn">
                                Register
                            </button>
                        </div>
                    </div>
                </form>
             </div>
          </div>
       </div>

这是错误:

Page not found (404)
Request Method: GET
Request URL:    localhost/accounts/register/accounts/verify
Using the URLconf defined in made.urls, Django tried these URL patterns, in this order:

admin/
[name='Homepage']
accounts/ login/ [name='Login-Page']
accounts/ register/ [name='Registeration-page']
accounts/ logout/
accounts/ verify/ [name='verification page']

【问题讨论】:

    标签: django python-3.x django-forms django-views django-users


    【解决方案1】:
    from django.contrib import admin
    from django.urls import path,include
    from . import views
    from django.contrib.auth.models import User
    
        urlpatterns = [
            path('login/', views.login, name='Login-Page'),
            path('register/', views.register, name='Registeration-page'),
            path('logout/', views.logout),
            path('verify/', views.verify, name='verificationPage')
    
    #
    def verify(request):
        if request.method == 'POST':
            sender_address = 'xyz@gmail.com'
            sender_pass = 'password'
            user_email = register.user.objects.email
            receiver_address = user_email
            passd = random.randrange(111111,10000000,39)
            mail_content = "Hello This is your verficatiob code   " + str(passd)
    
            def check(code):
                if code==passd:
                    return redirect('accounts/login')
                else:
                    messages.info(request,"Code is incorrect")
                    return HttpResponseRedirect(reverse('verificationPage')) # you'r issus
                    #Or    return HttpResponseRedirect("/Yourapp/verify")
            message = MIMEMultipart()
            message['From'] = sender_address
            message['To'] = receiver_address
            message['Subject'] = 'Verification Code'
            message.attach(MIMEText(mail_content, 'plain'))
            session = smtplib.SMTP(EMAIL_HOST, EMAIL_PORT)
            session.starttls()
            session.login(sender_address, sender_pass)
            text = message.as_string()
            session.sendmail(sender_address, receiver_address, text)
            session.quit()
            print('Mail Sent')
            code = request.POST['code']
    
            check(code)
        else:
            return render(request, 'email_verify.html')
    

    【讨论】:

    • Salah 你能告诉我如何使用用户电子邮件给他发送电子邮件吗?也请分享一下。
    【解决方案2】:

    如果您没有像在return redirect('accounts/verify') 中那样在 URL 的开头添加 /(斜杠),它将被添加到当前 URL 上,很遗憾您将被重定向到 “accounts/register/accounts/verify” 未定义。您需要像return redirect('/accounts/verify') 一样进行更改。或者,我的建议是用他们的名字代表他们。在这种情况下,它将是return redirect('verification page')

    这就是我发送电子邮件的方式,与你的方式有点不同。但它在我的项目上运行良好。

    settings.py

    EMAIL_BACKEND ="django.core.mail.backends.smtp.EmailBackend"
    EMAIL_HOST = "smtp.gmail.com"
    EMAIL_USE_TLS = True
    EMAIL_PORT = 587
    EMAIL_HOST_USER = "youremailadress@gmail.com"
    EMAIL_HOST_PASSWORD = "yourpassword"
    

    views.py

    from django.core.mail import send_mail
    
    send_mail("subject","message", EMAIL_HOST_USER, ["recipient@gmail.com"])
    

    【讨论】:

    • Mehmet 你能告诉我如何使用用户电子邮件向他发送电子邮件吗?也请分享一下。
    • 对不起,我也是新手,正在尝试在我的网站上实现此功能。但还是没能成功。我希望另一个人会很快回答你的问题。它也会帮助我:)
    • 我编辑了我的答案并写了如何发送电子邮件,请检查它并告诉我它是否正常
    • Mehmet 这种方式也可以正常工作,但我遇到的问题是,当我生成代码时,我无法将其保存在用户数据库中,并在以下步骤中使用该代码进行验证,感谢您的支持,
    猜你喜欢
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 2012-10-07
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多