在本文中,您将会了解到关于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())
- @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。
- 在相应的view方法的前面添加@login_required
- 并在settings.py中配置LOGIN_URL参数
- 修改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重定向到下一个
我觉得这是一个简单的问题,我只想走一小步。
我想执行以下任意操作(作为下一个参数中的术语):
[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
参数从表单传递login
到auth
并auth
重定向到该参数的方法
目前,我正在尝试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
我正在运行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
解决方法
result.startResolutionForResult(YourActivity.this,REQUEST_CODE);将显示帐户选择器对话框.听我说这就是你走了多远.那是对的吗?
在对话框中选择一个帐户后,您需要从活动的onActivityResult()进行另一次连接尝试.听起来像你可能会错过这段代码.
另请注意:如果这是您第一次连接,此时您将收到另一个错误.解决该问题将显示同意屏幕.如果用户接受,并且您进行了另一次连接尝试,则应该成功连接到API.
angularjs – required和ng-required之间有什么区别?
作为示例,和本质上是相同的事情
如果你想知道为什么这是这样,(而不只是使或),这是由于HTML的限制 – 没有相关联的值 – 它只是存在手段(根据HTML标准)元素是必需的 – 所以角需要一种方式设置/未设置所需的值(required =“false”将是无效的HTML)
ASP.NET Core MVC中Required与BindRequired用法与区别介绍
在开发ASP.NET Core MVC应用程序时,需要对控制器中的模型校验数据有效性,元数据注释(Data Annotations)是一个完美的解决方案。
元数据注释最典型例子是确保API的调用者提供了某个属性的值,在传统的ASP.NET MVC中使用的是RequiredAttribute
特性类。该属性仍然可以在ASP.NET Core MVC中使用,但也提供了一个新的特性类BindRequiredAttribute
。
今天让我们来看看它们之间的细微差别。
RequiredAttribute的典型用法
想象一下,您的模型是下面的BookOrder
类。为了强制Author
和Title
属性的值始终出现在传入的请求中,并且值不能为空,我们使用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
,但是同样适用于所有值的类型,例如DateTime
或Guid
。
以前,在传统的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格式的数据,BindRequiredAttribute
与BindNeverAttribute
特性类就不会起任何作用,这是因为模型直接通过Json.Net反序列化来创建,MVC框架并不知道属性的值从何而来。
上面补充的两点,感兴趣的同学可以自己进行测试。
总结
RequiredAttribute
特性类的行为在传统的ASP.NET MVC与ASP.NET Core MVC是一致的,校验属性的值不能为null
;RequiredAttribute
特性类对于值类型的属性,就没有任何效果了,所以在编码的过程将属性的类型改为可为空类型,不过编码的过程就比较纠结了,需要访问可为空类型的Value
属性,而且静态代码检测工具会警告需要进行非空的校验;BindRequiredAttribute
特性类可以解决值类型默认值的问题,强制要求客户端提交请求时,必须包含属性的值,不过属性的值可以为空,不进行非空的校验;- 在
RequiredAttribute
与BindRequiredAttribute
混合使用的情况下,我们也提供了优雅的方法,让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用法与区别介绍等更多相关知识的信息可以在本站进行查询。
本文标签: