GVKun编程网logo

Django中@login_required用法简介(django @login_required())

30

在本文中,您将会了解到关于Django中@login_required用法简介的新资讯,同时我们还将为您解释django@login_required()的相关在本文中,我们将带你探索Django中@

在本文中,您将会了解到关于Django中@login_required用法简介的新资讯,同时我们还将为您解释django @login_required()的相关在本文中,我们将带你探索Django中@login_required用法简介的奥秘,分析django @login_required()的特点,并给出一些关于@login_required之后的Django重定向到下一个、Android Google Fit onConnectionFailed()SIGN_IN_REQUIRED、angularjs – required和ng-required之间有什么区别?、ASP.NET Core MVC中Required与BindRequired用法与区别介绍的实用技巧。

本文目录一览:

Django中@login_required用法简介(django @login_required())

Django中@login_required用法简介(django @login_required())

我们在网站开发过程中,经常会遇到这样的需求:

  • 用户登陆系统才可以访问某些页面
  • 如果用户没有登陆而直接访问就会跳转到登陆界面,而不能访问其他页面。
  • 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址

要实现这样的需求其实很简单:

  1. 使用django自带的装饰器 @login_required。
  2. 在相应的view方法的前面添加@login_required
  3. 并在settings.py中配置LOGIN_URL参数
  4. 修改login.html中的表单action参数

view.py设置:

 

from djanco.contrib.auth.decorators import login_required
from django.shortcuts import render_to_response
from django.http import HttpResponse
  
@login_required
def myview(request):
    return render_to_response(''index.html'')

 

如果用户还没有登录,默认会跳转到‘/accounts/login/’。这个值可以在settings文件中通过LOGIN_URL参数来设定。(后面还会自动加上你请求的url作为登录后跳转的地址,如: /accounts/login/?next=/polls/3/ 登录完成之后,会去请求/poll/3)

setting.py设置:

LOGIN_URL = ''/accounts/login/''  #这个路径需要根据你网站的实际登陆地址来设置

 

urls.py设置:
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r''^admin/'', admin.site.urls),
    url(r''^, views.index),
    url(r''^accounts/login/, views.acc_login),
    url(r''^logout/, views.acc_logout),
    url(r''^host/, views.host, name=''host''),
    url(r''^asset/, views.asset,name=''asset''),
    url(r''^audit/, views.audit,name=''audit''),
]

 

如果LOGIN_URL使用默认值,那么在urls.py中还需要进行如下设置:(加入下面这句)

(r''^accounts/login/$'', ''django.contrib.auth.views.login''),

 

这样的话,如果登录,程序会默认跳转到“templates\registration\login.html”这个模板。

如果想换个路径,另一种方式:那就再加个template_name参数,如下:

(r''^accounts/login/$'', ''django.contrib.auth.views.login'', {''template_name'': ''myapp/login.html''}),

 

这样程序就会跳转到templates\myapp\login.html”

login.html设置:

<div>
  <formaction="/accounts/login/" method="post">{% csrf_token %} <!--csrf_token:生成令牌-->
    <h2align="center">登录系统</h2>
    <label for="inputUsername">username</label>
    <input type="text" name="username" id="inputUsername"placeholder="username" required autofocus>
    <label for="inputPassword">Password</label>
    <input type="password" name="password" id="inputPassword"placeholder="Password" required>
    <div>
      <label>
        <input type="checkbox" value="remember-me"> 记住密码
      </label>
    </div>
    <br />
    <buttontype="submit">登录</button>
    <br />
    <span>{{ login_err }}</span>
  </form>
</div> <!-- /container -->

  

其他有用方法

除了login这个有用的方法之外,auth模块还提供很多有用的方法,比如:

logout(request[, next_page, template_name, redirect_field_name])
password_change(request[, template_name, post_change_redirect, password_change_form])
password_change_done(request[, template_name])
password_reset(request[, is_admin_site, template_name, email_template_name, password_reset_form,token_generator, post_reset_redirect, from_email])
password_reset_done(request[, template_name])

  

用法用例:

(r''^change_passwd/$'', ''django.contrib.auth.views.password_change'', {
    ''template_name'': ''change_passwd.html'',
    ''post_change_redirect'': ''/'',
}),
(r''^reset_passwd/$'', ''django.contrib.auth.views.password_reset'', {
    ''template_name'': ''reset_passwd.html'',
    ''email_template_name'': ''reset_passwd_email.html'',
    ''post_reset_redirect'': ''/reset_done/'',
    ''from_email'': ''noreply@jihua.in'',
}),
(r''^reset_confirm/(?P<uidb36>[0-9A-Za-z]{1,13})-(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$'', \
    ''django.contrib.auth.views.password_reset_confirm'', {
        ''template_name'': ''reset_confirm.html'',
        ''post_reset_redirect'': ''/signin/'',
    }
),
(r''^reset_done/$'', ''django.views.generic.simple.direct_to_template'', {''template'': ''message.html'', ''extra_context'': {
    ''msg'': _(u''我们已将一封包含恢复密码步骤的邮件发到了您的邮箱,请查收''),
}}),

 

  原文:https://www.cnblogs.com/breezey/p/6715641.html

@login_required之后的Django重定向到下一个

@login_required之后的Django重定向到下一个

我觉得这是一个简单的问题,我只想走一小步。

我想执行以下任意操作(作为下一个参数中的术语):

[not signed in] -> profile -> login?next=/accounts/profile/ -> auth -> profile.[not signed in] -> newsfeed -> login?next=/newsfeed/` -> auth -> newsfeed.

而我目前要去的是:

[not signed in] -> profile -> login?next=/accounts/profile/ -> auth -> loggedin[not signed in] -> newsfeed -> login?next=/newsfeed/ -> auth -> loggedin

我正在寻找以某种方式将next参数从表单传递loginauthauth重定向到该参数的方法

目前,我正在尝试login.html

<input type=''text'' name="next" value="{{ next }}">

但是,这没有得到下一个值。我可以从调试工具栏中看到:

GET dataVariable    Valueu''next''     [u''/accounts/profile/'']

views

def auth_view(request):  username = request.POST.get(''username'', '''')  password = request.POST.get(''password'', '''')  user = auth.authenticate(username=username, password=password)  if user is not None:    auth.login(request, user)    print request.POST    return HttpResponseRedirect(request.POST.get(''next''),''/accounts/loggedin'')  else:    return HttpResponseRedirect(''/accounts/invalid'')

login.html

{% extends "base.html" %}{% block content %}  {% if form.errors %}  <p> Sorry, you have entered an incorrect username or password</p>  {% endif %}  <form action="/accounts/auth/" method="post">{% csrf_token %}    <label for="username">User name:</label>    <input type="text" name="username" value="" id="username">    <label for="password">Password:</label>    <input type="password" name="password" value="" id="password">    <input type=''text'' name="next" value="{{ request.GET.next }}">    <input type="submit" value="login">  </form>{% endblock %}

settings

from django.conf.urls import patterns, include, urlfrom django.contrib import adminadmin.autodiscover()urlpatterns = patterns('''',    # Examples:    url(r''^admin/'', include(admin.site.urls)),    (''^accounts/'', include(''userprofile.urls'')),    url(r''^accounts/login/$'', ''django_yunite.views.login''),    url(r''^accounts/auth/$'', ''django_yunite.views.auth_view''),    url(r''^accounts/logout/$'', ''django_yunite.views.logout''),    url(r''^accounts/loggedin/$'', ''django_yunite.views.loggedin''),    url(r''^accounts/invalid/$'', ''django_yunite.views.invalid_login''),)

settings

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)import osBASE_DIR = os.path.dirname(os.path.dirname(__file__))# SECURITY WARNING: don''t run with debug turned on in production!DEBUG = TrueTEMPLATE_DEBUG = TrueALLOWED_HOSTS = []# Application definitionINSTALLED_APPS = (    ''django.contrib.admin'',    ''django.contrib.auth'',    ''django.contrib.contenttypes'',    ''django.contrib.sessions'',    ''django.contrib.messages'',    ''django.contrib.staticfiles'',    ''debug_toolbar'',    ''userprofile'',)MIDDLEWARE_CLASSES = (    ''django.contrib.sessions.middleware.SessionMiddleware'',    ''django.middleware.common.CommonMiddleware'',    ''django.middleware.csrf.CsrfViewMiddleware'',    ''django.contrib.auth.middleware.AuthenticationMiddleware'',    ''django.contrib.messages.middleware.MessageMiddleware'',    ''django.middleware.clickjacking.XFrameOptionsMiddleware'',)ROOT_URLCONF = ''django_yunite.urls''WSGI_APPLICATION = ''django_yunite.wsgi.application''# Internationalization# https://docs.djangoproject.com/en/1.6/topics/i18n/LANGUAGE_CODE = ''en-ca''TIME_ZONE = ''EST''USE_I18N = TrueUSE_L10N = TrueUSE_TZ = True# Static files (CSS, JavaScript, Images)# https://docs.djangoproject.com/en/1.6/howto/static-files/STATIC_URL = ''/static/''STATICFILES_DIRS = (    (''assets'', ''/home/user/GitHub/venv_yunite/django_yunite/static/''),    )TEMPLATE_DIRS = (    ''./templates'',    ''/article/templates'',)STATIC_ROOT = "/home/user/Documents/static/"AUTH_PROFILE_MODULE = ''userprofile.UserProfile''

打印语句显示为空 u''next''

答案1

小编典典

查询字符串将隐式传递到任何视图,而无需编写任何特殊代码。

您要做的就是确保将next密钥从实际的登录表单(在您的情况下,这是在中呈现的表单/accounts/login/)传递到/accounts/auth视图。

为此,您需要确保django.core.context_processors.request在设置中启用了请求模板上下文处理器()。为此,首先需要导入的默认值TEMPLATE_CONTEXT_PROCESSORS,然后在中将请求处理器添加到其中settings.py,如下所示:

from django.conf import global_settingsTEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (    "django.core.context_processors.request",)

然后以以下形式:

<form method="POST" action="/accounts/auth">    {% csrf_token %}    <input type="hidden" name="next" value="{{ request.GET.next }}" />    {{ login_form }}    <input type="submit"></form>

现在,在您/accounts/auth看来:

def foo(request):    if request.method == ''POST'':        # .. authenticate your user        # redirect to the value of next if it is entered, otherwise        # to /accounts/profile/        return redirect(request.POST.get(''next'',''/accounts/profile/''))

Android Google Fit onConnectionFailed()SIGN_IN_REQUIRED

Android Google Fit onConnectionFailed()SIGN_IN_REQUIRED

我似乎无法解决这个问题.我只是无法登录.

我正在运行BasicSensorApi示例文件,它只是无法连接.
即使我在对话框中选择了一个帐户,我似乎也得到了RESULT_CANCELED?

这是我在OnePlus One 4.4上运行的logcat的结束.

关于我需要做什么的任何想法?

(Google控制台设置为’net.xx’,正确的SHA1,启用了fitness APi.

01-26 15:54:06.838  15678-15678/net.xx D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
01-26 15:54:06.888  15678-15678/net.xx I/BasicSensorsApi﹕ Ready
01-26 15:54:06.898  15678-15678/net.xx I/BasicSensorsApi﹕ Connecting...

01-26 15:54:07.008  15678-15678/net.xx D/Openglrenderer﹕ Enabling debug mode 0
01-26 15:54:07.018  15678-15678/net.xx I/BasicSensorsApi﹕ Connection Failed. Cause: ConnectionResult{statusCode=SIGN_IN_required,resolution=PendingIntent{41c147e8: android.os.BinderProxy@41c14788}}
01-26 15:54:07.458  15678-15678/net.xx I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@418ce750 time:11713882
01-26 15:54:09.898  15678-15678/net.xx I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@418ce750 time:11716323

解决方法

如果您未登录,则会收到Googleapiclient.OnConnectionFailedListener()的回调,并显示LogCat消息中显示的错误.如果您然后尝试使用解决问题
result.startResolutionForResult(YourActivity.this,REQUEST_CODE);将显示帐户选择器对话框.听我说这就是你走了多远.那是对的吗?

在对话框中选择一个帐户后,您需要从活动的onActivityResult()进行另一次连接尝试.听起来像你可能会错过这段代码.

另请注意:如果这是您第一次连接,此时您将收到另一个错误.解决该问题将显示同意屏幕.如果用户接受,并且您进行了另一次连接尝试,则应该成功连接到API.

angularjs – required和ng-required之间有什么区别?

angularjs – required和ng-required之间有什么区别?

required和ng-required(表单验证)有什么区别?
AngularJS表单元素查找执行验证功能所需的属性。 ng-required允许您根据布尔测试设置所需的属性(例如,如果您选择“学生”作为选择,则只需要字段B – 例如学生编号 – 如果字段A具有特定值)

作为示例,和本质上是相同的事情

如果你想知道为什么这是这样,(而不只是使或),这是由于HTML的限制 – 没有相关联的值 – 它只是存在手段(根据HTML标准)元素是必需的 – 所以角需要一种方式设置/未设置所需的值(required =“false”将是无效的HTML)

ASP.NET Core MVC中Required与BindRequired用法与区别介绍

ASP.NET Core MVC中Required与BindRequired用法与区别介绍

在开发ASP.NET Core MVC应用程序时,需要对控制器中的模型校验数据有效性,元数据注释(Data Annotations)是一个完美的解决方案。

元数据注释最典型例子是确保API的调用者提供了某个属性的值,在传统的ASP.NET MVC中使用的是RequiredAttribute特性类。该属性仍然可以在ASP.NET Core MVC中使用,但也提供了一个新的特性类BindRequiredAttribute

今天让我们来看看它们之间的细微差别。

RequiredAttribute的典型用法

想象一下,您的模型是下面的BookOrder类。为了强制AuthorTitle属性的值始终出现在传入的请求中,并且值不能为空,我们使用RequiredAttribute修饰它们。

    public class BookOrder
    {
        [Required]
        public string Author { get; set; }
     
        [Required]
        public string Title { get; set; }
    }

这在传统的ASP.NET MVC中是很常见方法。有了这个,您可以验证ModelState是否存在错误,因为对这些属性的验证失败会反映在这里。示例:

    [Route("bookorder")]
    public IActionResult PostBook([FromForm]BookOrder bookOrder)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
     
        // 正常逻辑代码
        return Content("OK");
    }

如果传入的请求中缺少两个必需的属性(或者属性的值为String.Empty),则响应将是一个400状态码,并将模型状态错误序列化到响应中。

使用Postman进行测试,请求中只提供了Title属性的值,而未提供Author属性的值:

常有趣的问题,例如当我们添加类似数量的属性时(类型为int)。在这种情况下,RequiredAttribute将无法正常工作,因为默认值为0,并且该属性不可能为空。即使客户端在不包括属性值的情况下提交请求,模型实例的值都将为0。换句话说,RequiredAttribute不起作用。在我们的例子中,我们使用的是int,但是同样适用于所有值的类型,例如DateTimeGuid

以前,在传统的ASP.NET MVC中,解决这个问题的方法是使用一个可为空类型,如下所示:

    public class BookOrder
    {
        [Required]
        public string Author { get; set; }
     
        [Required]
        public string Title { get; set; }
     
        [Required]
        public int? Quantity { get; set; }
    }

虽然它解决了这个问题,但是这不是最优雅的方式。Quantity属性不能为null,如果API的调用者未提供该属性的值,则该值保持为null,配合RequiredAttribute特性可以达到我们的目的。

这种方法的缺点是,在正常逻辑代码中,您需要直接访问可为空的Value属性。

    [Route("bookorder")]
    public IActionResult PostBook([FromForm]BookOrder bookOrder)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
     
        // 正常逻辑代码
        var requestedQuantity = bookOrder.Quantity.Value;
        
        return Content("OK");
    }

如果通过静态分析工具来检查代码,因为它们找不不到空值检测,所以会警告您可能出现空引用异常(即使在逻辑上,ModelState检测是足够的)。所以这并不是令人赏心悦目的方案。

如果在VS中安装了Resharper工具,会显示如下警告:

这就是BindRequiredAttribute产生的原因。它和RequiredAttribute的工作方式类似,它要求请求必须提示属性的值 。

我们将模型改为如下结构,Quantity属性为int类型,并使用[BindRequired]修饰:

    public class BookOrder
    {
        [Required]
        public string Author { get; set; }
     
        [Required]
        public string Title { get; set; }
     
        [BindRequired]
        public int Quantity { get; set; }
    }

使用Postman进行测试,在请求体不包括Quantity属性的值:

测试结果为ModelState.IsValid返回的false,要求提供Quantity属性的值。

RequiredAttribute与BindRequiredAttribute的差别

BindRequiredAttribute特性类只要求API的调用者提供该属性的值,但不进行空值检测,允许提供的值为空,例如我们将模型改为如下示例,所有属性中都使用了BindRequiredAttribute特性类进行注释:

    public class BookOrder
    {
        [BindRequired]
        public string Author { get; set; }
     
        [BindRequired]
        public string Title { get; set; }
     
        [BindRequired]
        public int Quantity { get; set; }
    }

使用Postman进行测试,在请求体包括这三个属性名称的参数,但是属性的值均为空或默认值:

测试结果为正常,BindRequiredAttribute特性类只要求API的调用者提供该属性的值,但不进行空值检测,允许提供的值为空

RequiredAttribute 与 BindRequiredAttribute 混用问题

当然,在代码中混合使用[Required][BindRequired]并不是一个最令人满意的效果。值得庆幸的是,ASP.NET Core MVC为您提供了足够的灵活性来改变RequiredAttribute的行为,强制它包含BindRequiredAttribute的行为。

您可以通过实现自己的IBindingMetadataProvider并在您的应用程序全局范围内注册来实现这一目标。

    public class RequiredBindingMetadataProvider : IBindingMetadataProvider
    {
        public void CreateBindingMetadata(BindingMetadataProviderContext context)
        {
            if (context.PropertyAttributes?.OfType<RequiredAttribute>().Any() ?? false) {
                context.BindingMetadata.IsBindingRequired = true;
            }
        }
    }

在全局范围内注册它:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc(o =>
        {
            o.ModelMetadataDetailsProviders.Add(new RequiredBindingMetadataProvider());
        });
    }

相关补充内容

1、ASP.NET Core MVC还提供了BindNeverAttribute特性类用于指定该属性不进行模型绑定。例如:您拥有一个像IsAdmin这样的属性,这需要通过服务端来指定,而不是通过客户提交的数据来指定;

2、如果客户端提交的是Json格式的数据,BindRequiredAttributeBindNeverAttribute特性类就不会起任何作用,这是因为模型直接通过Json.Net反序列化来创建,MVC框架并不知道属性的值从何而来。

上面补充的两点,感兴趣的同学可以自己进行测试。

总结

  • RequiredAttribute特性类的行为在传统的ASP.NET MVC与ASP.NET Core MVC是一致的,校验属性的值不能为null
  • RequiredAttribute特性类对于值类型的属性,就没有任何效果了,所以在编码的过程将属性的类型改为可为空类型,不过编码的过程就比较纠结了,需要访问可为空类型的Value属性,而且静态代码检测工具会警告需要进行非空的校验;
  • BindRequiredAttribute特性类可以解决值类型默认值的问题,强制要求客户端提交请求时,必须包含属性的值,不过属性的值可以为空,不进行非空的校验;
  • RequiredAttributeBindRequiredAttribute混合使用的情况下,我们也提供了优雅的方法,让RequiredAttribute包含BindRequiredAttribute的行为。

到此这篇关于ASP.NET Core MVC中Required与BindRequired用法与区别的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。

您可能感兴趣的文章:
  • .Net Core使用layui多文件上传
  • ASP.NET Core中的通用主机HostBuilder
  • ASP.NET Core托管模型CreateDefaultBuilder()方法
  • .NET跨平台应用MAUI介绍
  • .Net 6中WebApplicationBuilder介绍和用法
  • .NET新能源汽车锂电池检测程序UI挂死问题分析

今天关于Django中@login_required用法简介django @login_required()的介绍到此结束,谢谢您的阅读,有关@login_required之后的Django重定向到下一个、Android Google Fit onConnectionFailed()SIGN_IN_REQUIRED、angularjs – required和ng-required之间有什么区别?、ASP.NET Core MVC中Required与BindRequired用法与区别介绍等更多相关知识的信息可以在本站进行查询。

本文标签: