首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在django app中,每个用户只允许一次并发登录

在 Django 应用程序中,要实现每个用户只允许一次并发登录,可以使用 Django 的内置功能 SessionAuthentication 和自定义的 UserTokenMiddleware

首先,在 Django 的 settings.py 文件中,将 SessionAuthentication 添加到 AUTHENTICATION_BACKENDS 中:

代码语言:python
代码运行次数:0
复制
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'django.contrib.auth.backends.SessionAuthentication',
]

然后,创建一个名为 UserTokenMiddleware 的中间件,用于检查用户的会话令牌是否有效:

代码语言:python
代码运行次数:0
复制
class UserTokenMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if request.user.is_authenticated:
            token = request.session.get('user_token')
            if token != request.user.token:
                logout(request)
        return self.get_response(request)

最后,将 UserTokenMiddleware 添加到 Django 的 settings.py 文件中的 MIDDLEWARE 列表中:

代码语言:python
代码运行次数:0
复制
MIDDLEWARE = [
    # ...
    'myapp.middleware.UserTokenMiddleware',
]

这样,在 Django 应用程序中,每个用户只允许一次并发登录。如果用户尝试在其他地方登录,他们将被注销,并且其他会话将被终止。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python 项目实践三(Web应用程序)第五篇

下面base.html添加到登录页面的链接,让所有页面都包含它。...本节,我们将修改模型Topic,让每个主题都归属于特定用户。这也将影响条目,因为每个条目都属于特定的主题。我们先来限制对一些页面的访问。...1 使用@login_required 限制访问 Django提供了装饰器@login_required,让你能够轻松地实现这样的目标:对于某些页面,只允许登录用户访问它们。...只要每个主题都归属于特定用户,我们就能确定数据库每个条目的所有者。 下面来修改模型Topic,在其中添加一个关联到用户的外键。这样做后,我们必须对数据库进行迁移。...为此,启动一个Django shell会话,并执行如下命令: ? 3 迁移数据库 知道用户ID后,就可以迁移数据库了。 ? 现在可以执行迁移了。为此,活动的虚拟环境执行下面的命令: ?

1.3K80

django 1.8 官方文档翻译:13-1-2 使用Django认证系统

这些权限将在你运行manage.py migrate时创建;添加django.contrib.auth到INSTALLED_APPS之后,当你第一次运行migrate时,将会为之前安装的模型创建默认的权限...权限的缓存 ModelBackend一次需要访问User对象来检查权限时会缓存它们的权限。这对于请求-响应循环还是比较好的,因为权限添加进来之后并不会立即检查(例如在admin)。...Web请求的认证 Django使用会话和中间件来拦截request 对象到认证系统。 它们每个请求上提供一个request.user属性,表示当前的用户。...如果你升级一个现存的站点,并且希望开启这一间件,而不希望你的所有用户之后重新登录,你可以首先升级到DJango1.7并且运行它一段时间,以便所有会话在用户登录时自然被创建,它们包含上面描述的会话哈希..., extra_context, html_email_template_name])[source] 允许用户通过生成一次性的连接并发送到用户注册的邮箱地址来重置密码。

4.6K20
  • 六种Web身份验证方法比较和Flask示例代码

    它不要求用户每个请求中提供用户名或密码。相反,登录后,服务器将验证凭据。如果有效,它将生成一个会话,将其存储会话存储,然后将会话 ID 发送回浏览器。...许多框架(如Django)开箱即用地提供了此功能。 缺点 它是有状态的。服务器跟踪服务器端的每个会话。用于存储用户会话信息的会话存储需要在多个服务之间共享才能启用身份验证。...包 烧瓶-登录 Flask-HTTPAuth Django用户身份验证 快速API登录 FastAPI-Users 代码 Flask-Login非常适合基于会话的身份验证。...() 资源 IETF:基于 Cookie 的 HTTP 身份验证 如何使用 Flask 登录为您的应用程序添加身份验证 基于会话的身份验证,带 Flask,适用于单页应用 烧瓶的CSRF保护 Django...如果 OpenID 系统已关闭,用户将无法登录。 人们通常倾向于忽略 OAuth 应用程序请求的权限。 已配置的 OpenID 提供程序上没有帐户的用户将无法访问您的应用程序。

    7.3K40

    Django Session和Cookie分别实现记住用户登录状态操作

    故为了让用户浏览器再次访问该服务端时,他的登录状态能够保留(也可翻译为该用户访问这个服务端其他网页时不需再重复进行用户认证)。...@check_login def index(request): return render(request, "app/index.html") 由上面看出,其实就是一次用户登录成功时,设置cookie...(Django应用的setting.py配置Session数据库)。 根据以上描述,我们知道Session把用户的敏感信息都保存到了服务端数据库,这样具有较高的安全性。...这个setting.py配置:(注意我这里数据库用的mongodb,并使用了django_mongoengine库;关于这个配置请根据自己使用的数据库进行选择,具体配置可参考官方教程) SESSION_ENGINE...总结 session和cookie都能实现记住用户登录状态的功能,如果为了安全起见,还是使用session更合适 以上这篇Django Session和Cookie分别实现记住用户登录状态操作就是小编分享给大家的全部内容了

    1.7K21

    Django实战-信息资讯-CMS后台管理-上

    实现后台管理权限的配置,可以通过 django 自带的用户模型的 is_staff 属性,来给对应的用户授予后台操作的权限。...① 后台权限 django用户可分为两类,一是可认证的用户,也就是django.contrib.auth.models.User中注册了的;另一种是匿名用户django.contrib.auth.models.AnonymousUser...,每个访问的未登录用户都是该类的一个实例,而匿名用户是无法认证的,即 is_authenticated 方法永远返回 False,或者is_anonymous返回True,我们可以代码逻辑实现对匿名用户进行判断...,然后拒绝其访问(403),或者重定向到登录页面等。...只允许 staff 身份的用户访问某个视图,django同样提供了一个便捷的装饰器来实现这个功能: from django.contrib.admin.views.decorators import staff_member_required

    70030

    CRM客户关系管理系统(十三) 第十三章、用户自定义认证第十四章、万能通用权限框架设计

    第十三章、用户自定义认证 13.1.用户自定义认证 class Meta:              abstract = True   (不会创建表,只把字段继承给子类) django加密方式:md5...#2.把url解析成url_name(通过resolve) #3.判断用户是否已登录(user.is_authenticated()) #3.拿url_name到permission_dict...request.user.is_authenticated(),current_url_name) #match_flag = False match_key = None #判断用户是否登录...14.2.自定义权限钩子实现 只允许用户访问自己创建的数据,比如只允许销售访问自己创建的客户: (1)kingadmin/permission_list.py 'crm_table_list': ['table_obj_list...kingadmin/permission_hook.py # kingadmin/permission_hook.py def view_my_own_customers(request): #当前登录用户

    1.1K00

    Django+Django-Celery+Celery的整合实战

    django去完成的app,本文中要编写的就是INSTALLED_APPS中注册的apps。...celery.py设定了对settings.pyINSTALLED_APPS做autodiscover_tasks,本文希望apps能够接受这样的目录组织:所有的app都可以放到apps下面,而且每个...app都有独立的目录,就和上面的app1、app2一样,每个app各自有各自的init.py和tasks.py(注意,每个app都需要init.py文件,可以是空白的)。...然后apps下增加了一个init.py文件,这时报错没了,但是apps下每个app的tasks.py的任务函数还是无法被django和celery worker找到。...实际运用,我们只需要修改或者添加到tasks.py文件里一些函数,让他注册到里边。我们从前台django-web写入任务,可以使其动态加载到任务。并且把正确的参数传过去,就可以正常执行。

    2.1K31

    django-利用session机制实现唯一登录的例子

    ,本机器应该被挤下即当前sessionkey失效,后登录用户的session可用,之前的sessionkey从数据库删除 # 获取指定key的session_data,下面用的ORM模型去数据库取数据...故为了让用户浏览器再次访问该服务端时,他的登录状态能够保留(也可翻译为该用户访问这个服务端其他网页时不需再重复进行用户认证)。.../index.html") 由上面看出,其实就是一次用户登录成功时,设置cookie,用户访问其他页面时进行cookie验证,用户登出时删除cookie。...(Django应用的setting.py配置Session数据库)。 根据以上描述,我们知道Session把用户的敏感信息都保存到了服务端数据库,这样具有较高的安全性。...这个setting.py配置:(注意我这里数据库用的mongodb,并使用了django_mongoengine库;关于这个配置请根据自己使用的数据库进行选择,具体配置可参考官方教程) SESSION_ENGINE

    1.7K31

    Django权限系统auth模块详解

    4  is_authenticated() 要求: 1  用户登陆后才能访问某些页面, 2  如果用户没有登录就访问该页面的话直接跳到登录页面 3  用户跳转的登陆界面完成登陆后,自动访问跳转到之前访问的地址...若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以settings文件通过LOGIN_URL进行修改)。...只是这个用户拥有所有的权限而不需要给他们分配明确的权限。 last_login 用户最后一次登录的时间。 date_joined 账户创建的时间。...logout(request) return HttpResponseRedirect('/') 只允许登录用户访问 @login_required修饰器修饰的view函数会先通过session...') user.has_perm('blog.delete_article') 上述语句检查用户是否拥有blog这个apparticle模型的添加权限, 若拥有权限则返回True。

    1.6K20

    高阶应用-用户验证

    request.user.username 获取当前登录用户用户名 last_login 自动保存 不需要自己添加代码 上一次登录时间,为datetime对象,默认为当时的时间。...is_active为False 则认证失败 模板判断是否登录 Django自带的用户认证授权系统 如果用户已经授权成功,说明用户已经登录成功,那么渲染index.html的时候,直接展示已登录状态即可...="hljs-keyword">return HttpResponse('视图函数获取登录用户的数据') 八、退出登录...:index')) 九、权限判断(只允许登录用户访问) @login_required修饰器修饰的view函数会先通过session key检查是否登录, 已登录用户可以正常的执行操作,...AUTH_USER_MODEL = 'App.User' 将迁移文件 和 库删除 重新执行迁移 添加自定义用户认证 App下新建一个

    82720

    Django权限设置及验证方式

    当创建一个Models, 同步到数据库里,django默认设置了三个权限 ,就是 add, change, delete权限。...验证权限的方法一般有两种,一种是用@permission_required来进行验证,第二是用user.has_perm()函数里进行验证,通过返回的True或者False来进行下一步 同时我的稍微复杂一些...,是django中加入了第三方认证oauth2,并限制跨域访问的资源.具体见我之前的文章....需要注意的是使用@permission_required(perms)时request.user需有字段,否则会报错.我这里没有登录也可以访问授权是因为我使用了用户允许的授权码访问,会直接在request...补充知识:django 校验用户是否有权限 views判断是否有权限: {% if request.user.has_perm('app.权限名')%} …… {%endif%} html根据权限判断控件是否显示

    1.5K10

    美多商城项目(九)

    我们可以将涉及到数据库操作的部分进行错误捕获,有错统一返回下单失败;如果想让代码部分的涉及到不同的异常抛出,可以统一返回下单失败之前再进行一次捕获异常,抛出不同的异常。...4.4订单并发-解决方案 4.4.1解决方案-悲观『锁』 事务查询数据的时候尝试对数据进行加锁(互斥锁),获取到锁的事务可以对数据进行操作,获取不到锁的事务会阻塞,直到锁被释放。...此次,用户A和用户B获取商品信息之后都记录一下原始库存,在下单成功之前,再进行一次库存查询。用户A执行完后,用户B进行操作时,两次库存不一致,更新失败,重新进行尝试。...隔离级别 说明 Repeatable read 可重复读 事务执行同一个查询语句时,获取到的结果永远和第一次获取的结果一致,即使其他事务修改了对应的数据并且进行了提交,当前事务仍然获取不到更新之后的结果...团队开发注意事项 浅谈密码加密 Django框架的英文单词 Django数据库的相关操作 DRF框架的英文单词 重点内容回顾-DRF Django相关知识点回顾

    97110

    uWSGI和WSGI之间的关系(下)

    四.总结 django并发能力真的是令人担忧,这里就使用 nginx + uwsgi 提供高并发 nginx 的并发能力超高,单台并发能力过万(这个也不是绝对),纯静态的 web 服务更是突出其优越的地方...Django就没有用异步,通过线程来实现并发,这也是WSGI普遍的做法,跟tornado不是一个概念 官方文档解释django自带的server默认是多线程 django开两个接口,第一个接口sleep...django项目目录下 Demo工程名 uwsgi –http 0.0.0.0:8000 –file Demo/wsgi.py 经过上述的步骤测试,发现在这种情况下启动django项目,uWSGI也是单线程...8000 –file Demo/wsgi.py –processes 4 –threads 2 processes: 进程数 # processes 和 workers 一样的效果 # threads : 每个进程开的线程数经过测试...,接口可以”同时”访问,uWSGI提供多线程 Python因为GIL的存在,一个进程,只允许一个线程工作,导致单进程多线程无法利用多核多进程的线程之间不存在抢GIL的情况,每个进程有一个自己的线程锁

    1.3K10

    Python面试题大全(三):Web开发(Flask、爬虫)

    flask,路由是通过装饰器给每个视图函数提供的,而且根据请求方式的不同可以一个url用于不同的作用。 Django 142.什么是wsgi,uwsgi,uWSGI?...利用cookies来实现会话管理时,用户的相关信息或者其他我们想要保持每个请求的信息,都是放在cookies,而cookies是由客户端来保存,每当客户端发出新请求时,就会稍带上cookies,服务端会根据其中的信息进行操作...JWT是如何工作的 首先用户发出登录请求,服务端根据用户登录请求进行匹配,如果匹配成功,将相关的信息放入payload,利用算法,加上服务端的密钥生成token,这里需要注意的是secret_key...access_token再向qq服务器获取用户的openid(openid用户的唯一标识) 第三个接口是判断用户是否是第一次qq登录,如果不是的话直接登录返回的jwt-token给用户,对没有绑定过本网站的用户...Django中间件预置了六个方法,这六个方法的区别在于不同的阶段执行,对输入或输出进行干预,方法如下: 1.初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件 def

    94720

    Django中间件学习之如何使用自定义中间件

    难道你要在项目里的每个视图里都进行一次登录与否的判断么!!!...因为此方法是执行视图之前被调用,而且是用户每个请求都会调用! 这就是中间件的牛逼之处!!! 中间件 现在你看这个图可能有点迷,等你给本篇文看完之后再看这个图会感觉真牛逼哈哈!...django 的中间件(middleware),django,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件相应的方法。...django项目的settings文件,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件。...,每个请求上调用,返回HttpResponse对象 (3)自定义中间件的实操步骤: 小提醒:自定义中间件也可以放在该项目的任意可以导入的地方(但是习惯性是放在 app根目录里面) 步骤: 主目录下创建了一个

    52300

    关于“Python”的核心知识点整理大全58

    我们base.html添加这种链接,让每个页面都包含它; 我们将它放在标签{% if user.is_authenticated %},使得仅当用户登录后才能看到它: base.html...请尝试使用注册页面创建几个用户名各不相同的用户账户。 在下一节,我们将对一些页面进行限制,仅让已登录用户访问它们,我们还将确保每个主 题都属于特定用户。...本节,我们将修改模型Topic,让每个主题都归属于特定用户。这也将影响条目,因为 每个条目都属于特定的主题。我们先来限制对一些页面的访问。...限制对topics页面的访问 每个主题都归特定用户所有,因此应只允许登录用户请求topics页面。...login_required()的代码检查用户是否已登录,仅当用户登录时,Django才运行topics() 的代码。如果用户登录,就重定向到登录页面。

    11310

    关于python开发CRM系统

    如何调用djangoadmin的认证功能 如果想要调用django的admin认证需要: models.py文件创建表的类的时候,先导入一个模块 from django.contrib.auth.models..., 如果想要获取具体的用户名字则需要通过user.userprofile.name, 关于动态菜单 根据属于不同的用户角色的用户登录是显示不同的菜单...,即动态添加active 这里可以根据url来设置,因为每个菜单的都是一个a标签而a标签的href属性和当前的页面的url是相同的 通过通过js获取当前的url也就是’{{request.path}...}’ 关于djangoadmin的自定制功能 django的admin可以自定义显示的字段内容,需要在admin.py配置文件做如下配置: class CustomerAdmin(admin.ModelAdmin...django登录admin的时候显示如上图,会显示所有的app名字,并且每个app下会显示该app所有的表名 这里有几个知识点需要注意: 关于如何获取所有的app 所有注册的app都会在sttings

    3.2K90
    领券