Django——Shell模式下使用的匹配符及说明

__exact: 精确等于,如SQL的like'开发'。 例:filter(job__exact='开发')

__iexact: 精确等于并忽略大小写。 例:filter(job__iexact='开发')

__contains: 模糊匹配,如SQL的like'%荣耀%'。 例:filter(job__contains='开发')

__icontains: 模糊匹配,忽略大小写。 例:filter(job__icontains='开发')

__gt: 大于。 例:filter(job__gt=5)

__gte: 大于等于。 例:filter(job__gte=5)

__lt: 小于。 例:filter(job__lt=5)

__lte: 小于等于。 例:filter(job__lte=5)

__in: 判断是否在列表内。 例:filter(job__in=[1,2,3])

__startswith:以。。。开头。    例:filter(job__startswith='开发')

__istartswith:以。。。开头并忽略大小写。    filter(job__istartswith='开发')

__endswith: 以。。。结尾。    filter(job__endswith='开发')

__iendswith: 以。。。结尾并忽略大小写。    filter(job__iendswith='开发')

__range: 在。。。范围内。    filter(job__range='开发')

__year: 日期字段的年份。    filter(job__year='2018')

__month: 日期字段的月份。    filter(job__month='12')

__day: 日期字段的天数。 例:filter(job__day=30)

__isnull: 判断是否为空。 例:filter(job__isnull=True/False)

<< ### 不使用 Djoser 构建 Django REST Framework 登录验证系统的完整案例 如果你不想使用 `djoser` 或其他类似库来构建用户注册、登录等身份验证功能,你可以从头开始编写这些功能。以下是如何在不借助外部库的情况下实现基本的用户认证系统的方法。 #### 项目概述 本教程将指导您如何创建一个包括用户注册、JWT令牌生成和验证的基本Web API应用程序。我们将利用Django内置的身份验证框架(`auth`)以及`djangorestframework-simplejwt`来进行Token管理。 #### 第一步:准备环境与安装依赖包 假设你已经有了Python开发环境并且激活了一个虚拟环境,请按照下列步骤操作: 1. **初始化新的 Django 项目**: ```shell django-admin startproject mysite cd mysite/ ``` 2. **创建一个新的应用** (`accounts`), 并将其添加到 INSTALLED_APPS 设置中: ```shell python manage.py startapp accounts ``` 3. **安装必要的扩展**: - `djangorestframework`: 基础RESTful API工具. - `djangorestframework-simplejwt`: JWT Token机制的支持. 使用 pip 安装它们: ```shell pip install djangorestframework djangorestframework-simplejwt ``` 4. 在您的项目的 `settings.py` 中更新 `INSTALLED_APPS`, 加入新安装的应用程序: ```python INSTALLED_APPS = [ ... 'rest_framework', 'rest_framework_simplejwt.token_blacklist', # 黑名单支持可选 'accounts' ] ``` 5. 更新中间件列表以启用跨源资源共享(CORS),如果需要的话(通常用于前后端分离): ```python MIDDLEWARE = [ ... 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', ] CORS_ORIGIN_ALLOW_ALL=True # 生产环境中应改为白名单模式CORS_ALLOWED_ORIGINS=[]并指定域名 ``` 6. 设置默认权限类为只读或完全认证过的访问策略,同时也指定了JWT作为默认的身份验证方法之一: ```python REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticatedOrReadOnly',), 'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework_simplejwt.authentication.JWTAuthentication'], } ``` 7. 导入Simple JWT配置参数至同一文件末尾处: ```python from datetime import timedelta SIMPLE_JWT={ 'ACCESS_TOKEN_LIFETIME':timedelta(minutes=60), 'REFRESH_TOKEN_LIFETIME':timedelta(days=1), 'ROTATE_REFRESH_TOKENS':False, 'BLACKLIST_AFTER_ROTATION':True, 'ALGORITHM':'HS256', 'SIGNING_KEY':SECRET_KEY, 'VERIFYING_KEY':None, 'AUTH_HEADER_TYPES':('Bearer',), 'USER_ID_FIELD':'id', 'USER_ID_CLAIM':'user_id', 'AUTH_TOKEN_CLASSES':('rest_framework_simplejwt.tokens.AccessToken',), 'TOKEN_TYPE_CLAIM':'token_type', 'JTI_CLAIM':'jti', } ``` 8. 创建超级管理员账号以便后续测试时可以获取合法 Tokens : ```shell python manage.py createsuperuser ``` 9. 最后别忘了同步数据库模型变更及迁移命令,确保所有表都已准备好接收数据。 ```shell python manage.py makemigrations && python manage.py migrate ``` #### 第二步:编写序列化器 (Serializers) 为了能够处理JSON格式的数据输入输出转换,在`accounts`目录下新建名为`serializers.py`的文件,并定义相应的序列化规则: ```python from rest_framework import serializers from django.contrib.auth.models import User class RegisterSerializer(serializers.ModelSerializer): password = serializers.CharField(write_only=True) class Meta: model=User fields=('username','email','password') def create(self, validated_data): user=User.objects.create_user(**validated_data) return user class LoginSerializer(serializers.Serializer): username_or_email = serializers.CharField(max_length=255) password = serializers.CharField(style={'input_type': 'password'}) ``` 这里分别实现了两个主要的功能——一个是用来解析和保存新用户的注册资料;另一个则是负责检查现有用户的凭据是否匹配从而发放有效的Tokens . #### 第三步:设置视图(Views)和路由器(Routers) 接下来我们要把上述定义好的逻辑整合进具体的HTTP请求处理器之中。为此我们需要修改 `views.py` 文件并导入相关组件: ```python from rest_framework import status, permissions from rest_framework.response import Response from rest_framework.decorators import api_view, permission_classes from rest_framework_simplejwt.tokens import RefreshToken from .serializers import RegisterSerializer,LoginSerializer @api_view(['POST']) @permission_classes([permissions.AllowAny]) def register(request): if request.method == 'POST': serializer = RegisterSerializer(data=request.data) if not serializer.is_valid(): return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST) new_user=serializer.save() refresh_token=RefreshToken.for_user(new_user) response_data={"message": "Register Successfully", "refresh": str(refresh_token), "access": str(refresh_token.access_token)} return Response(response_data, status=status.HTTP_201_CREATED) @api_view(['POST']) @permission_classes([permissions.AllowAny]) def login(request): serializer=LoginSerializer(data=request.data) try: user_obj=None email_or_username=request.POST.get("username_or_email") password=request.POST.get("password") # 尝试根据邮箱查找用户; 否则按用户名搜索 if '@' in email_or_username and '.' in email_or_username: user_obj=User.objects.filter(email=email_or_username).first() or None else: user_obj=User.objects.filter(username=email_or_username).first() or None if user_obj is None: raise Exception("Invalid Credentials.") elif not user_obj.check_password(password): raise Exception("Incorrect Password.") refresh_token=RefreshToken.for_user(user_obj) data={ "success": True, "message":"Logged In successfully.", "tokens":{"refresh":str(refresh_token),"access":str(refresh_token.access_token)}, } return Response(data=data,status=status.HTTP_200_OK) except Exception as e: error_message=str(e) return Response({"error":error_message},status=status.HTTP_400_BAD_REQUEST) ``` 在这里我们定义了两条URL路由对应于不同的HTTP POST动作——一条是用来接受新的成员加入我们的平台,另一条则是让用户提供他们的凭证信息交换得到短期有效性的Access Tokens 和长期可用性的Refresh Tokens。 此外还需要告诉Django哪些路径应当被映射到上面提到的动作上去。因此可以在主项目文件夹内的urls.py里面做如下的调整: ```python from django.urls import path from accounts.views import * urlpatterns=[ ... path('api/auth/register/',register,name='register'), path('api/auth/login/',login,name='login') ] ``` 现在你应该拥有了一套完整的、不需要额外插件就能工作的基础用户管理体系啦!不过需要注意的是这只是最简化的版本,对于实际部署而言可能还需要考虑诸如密码强度检测之类的细节部分哦~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值