<address id="nhfpd"></address>

                <sub id="nhfpd"></sub>

                  drf-jwt手动签发与校验,drf小组件:过滤、筛选、排序、分页

                  今日

                  """
                  1、drf-jwt手动签发与校验
                  2、drf小组件:过滤、筛选、排序、分页 => 针对与群查接口
                  """

                  签发token

                  源码入口
                  # 前提:给一个局部禁用了所有 认证与权限 的视图类发送用户信息得到token,其实就是登录接口
                  
                  # 1)rest_framework_jwt.views.ObtainJSONWebToken 的 父类 JSONWebTokenAPIView 的 post 方法
                  #       接受有username、password的post请求
                  # 2)post方法将请求数据交给 rest_framework_jwt.serializer.JSONWebTokenSerializer 处理
                  #       完成数据的校验,会走序列化类的 全局钩子校验规则,校验得到登录用户并签发token存储在序列化对象中
                  核心源码:rest_framework_jwt.serializer.JSONWebTokenSerializer的validate(self, attrs)方法
                  def validate(self, attrs):
                      # 账号密码字典
                      credentials = {
                          self.username_field: attrs.get(self.username_field),
                          'password': attrs.get('password')
                      }
                      if all(credentials.values()):
                          # 签发token第1步:用账号密码得到user对象
                          user = authenticate(**credentials)
                          if user:
                              if not user.is_active:
                                  msg = _('User account is disabled.')
                                  raise serializers.ValidationError(msg)
                              # 签发token第2步:通过user得到payload,payload包含着用户信息与过期时间
                              payload = jwt_payload_handler(user)
                              # 在视图类中,可以通过 序列化对象.object.get('user'或者'token') 拿到user和token 
                              return {
                                  # 签发token第3步:通过payload签发出token
                                  'token': jwt_encode_handler(payload),
                                  'user': user
                              }
                          else:
                              msg = _('Unable to log in with provided credentials.')
                              raise serializers.ValidationError(msg)
                      else:
                          msg = _('Must include "{username_field}" and "password".')
                          msg = msg.format(username_field=self.username_field)
                          raise serializers.ValidationError(msg)
                  手动签发token逻辑
                  # 1)通过username、password得到user对象
                  # 2)通过user对象生成payload:jwt_payload_handler(user) => payload
                  #       from rest_framework_jwt.serializers import jwt_payload_handler
                  # 3)通过payload签发token:jwt_encode_handler(payload) => token
                  #       from rest_framework_jwt.serializers import jwt_encode_handler

                  校验token

                  源码入口
                  # 前提:访问一个配置了jwt认证规则的视图类,就需要提交认证字符串token,在认证类中完成token的校验
                  
                  # 1)rest_framework_jwt.authentication.JSONWebTokenAuthentication 的 父类 BaseJSONWebTokenAuthentication 的 authenticate 方法
                  #       请求头拿认证信息jwt-token => 通过反爬小规则确定有用的token => payload => user
                  核心源码:rest_framework_jwt.authentication.BaseJSONWebTokenAuthentication的authenticate(self, request)方法
                  def authenticate(self, request):
                      """
                      Returns a two-tuple of `User` and token if a valid signature has been
                      supplied using JWT-based authentication.  Otherwise returns `None`.
                      """
                      # 带有反爬小规则的获取token:前台必须按 "jwt token字符串" 方式提交
                      # 校验user第1步:从请求头 HTTP_AUTHORIZATION 中拿token,并提取
                      jwt_value = self.get_jwt_value(request)
                      # 游客
                      if jwt_value is None:
                          return None
                      # 校验
                      try:
                          # 校验user第2步:token => payload
                          payload = jwt_decode_handler(jwt_value)
                      except jwt.ExpiredSignature:
                          msg = _('Signature has expired.')
                          raise exceptions.AuthenticationFailed(msg)
                      except jwt.DecodeError:
                          msg = _('Error decoding signature.')
                          raise exceptions.AuthenticationFailed(msg)
                      except jwt.InvalidTokenError:
                          raise exceptions.AuthenticationFailed()
                      # 校验user第3步:token => payload
                      user = self.authenticate_credentials(payload)
                  
                      return (user, jwt_value)
                  手动校验token逻辑
                  # 1)从请求头中获取token
                  # 2)根据token解析出payload:jwt_decode_handler(token) => payloay
                  #       from rest_framework_jwt.authentication import jwt_decode_handler
                  # 3)根据payload解析出user:self.authenticate_credentials(payload) => user
                  #       继承drf-jwt的BaseJSONWebTokenAuthentication,拿到父级的authenticate_credentials方法

                  案例:实现多方式登陆签发token

                  models.py
                  from django.db import models
                  
                  from django.contrib.auth.models import AbstractUser
                  class User(AbstractUser):
                      mobile = models.CharField(max_length=11, unique=True)
                  
                      class Meta:
                          db_table = 'api_user'
                          verbose_name = '用户表'
                          verbose_name_plural = verbose_name
                  
                      def __str__(self):
                          return self.username
                  serializers.py
                  from rest_framework import serializers
                  from . import models
                  import re
                  
                  # 拿到前台token的两个函数: user => payload => token
                  # from rest_framework_jwt.settings import api_settings
                  # jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
                  # jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
                  from rest_framework_jwt.serializers import jwt_payload_handler
                  from rest_framework_jwt.serializers import jwt_encode_handler
                  
                  
                  # 1) 前台提交多种登录信息都采用一个key,所以后台可以自定义反序列化字段进行对应
                  # 2) 序列化类要处理序列化与反序列化,要在fields中设置model绑定的Model类所有使用到的字段
                  # 3) 区分序列化字段与反序列化字段 read_only | write_only
                  # 4) 在自定义校验规则中(局部钩子、全局钩子)校验数据是否合法、确定登录的用户、根据用户签发token
                  # 5) 将登录的用户与签发的token保存在序列化类对象中
                  class UserModelSerializer(serializers.ModelSerializer):
                      # 自定义反序列字段:一定要设置write_only,只参与反序列化,不会与model类字段映射
                      usr = serializers.CharField(write_only=True)
                      pwd = serializers.CharField(write_only=True)
                      class Meta:
                          model = models.User
                          fields = ['usr', 'pwd', 'username', 'mobile', 'email']
                          # 系统校验规则
                          extra_kwargs = {
                              'username': {
                                  'read_only': True
                              },
                              'mobile': {
                                  'read_only': True
                              },
                              'email': {
                                  'read_only': True
                              },
                          }
                  
                      def validate(self, attrs):
                          usr = attrs.get('usr')
                          pwd = attrs.get('pwd')
                  
                          # 多方式登录:各分支处理得到该方式下对应的用户
                          if re.match(r'[email protected]+', usr):
                              user_query = models.User.objects.filter(email=usr)
                          elif re.match(r'1[3-9][0-9]{9}', usr):
                              user_query = models.User.objects.filter(mobile=usr)
                          else:
                              user_query = models.User.objects.filter(username=usr)
                          user_obj = user_query.first()
                  
                          # 签发:得到登录用户,签发token并存储在实例化对象中
                          if user_obj and user_obj.check_password(pwd):
                              # 签发token,将token存放到 实例化类对象的token 名字中
                              payload = jwt_payload_handler(user_obj)
                              token = jwt_encode_handler(payload)
                              # 将当前用户与签发的token都保存在序列化对象中
                              self.user = user_obj
                              self.token = token
                              return attrs
                  
                          raise serializers.ValidationError({'data': '数据有误'})
                  views.py
                  #实现多方式登陆签发token:账号、手机号、邮箱等登陆
                  # 1) 禁用认证与权限组件
                  # 2) 拿到前台登录信息,交给序列化类
                  # 3) 序列化类校验得到登录用户与token存放在序列化对象中
                  # 4) 取出登录用户与token返回给前台
                  import re
                  from . import serializers, models
                  from utils.response import APIResponse
                  
                  from rest_framework_jwt.serializers import jwt_payload_handler
                  from rest_framework_jwt.serializers import jwt_encode_handler
                  
                  class LoginAPIView(APIView):
                      # 1) 禁用认证与权限组件
                      authentication_classes = []
                      permission_classes = []
                      def post(self, request, *args, **kwargs):
                          # 2) 拿到前台登录信息,交给序列化类,规则:账号用usr传,密码用pwd传
                          user_ser = serializers.UserModelSerializer(data=request.data)
                          # 3) 序列化类校验得到登录用户与token存放在序列化对象中
                          user_ser.is_valid(raise_exception=True)
                          # 4) 取出登录用户与token返回给前台
                          return APIResponse(token=user_ser.token, results=serializers.UserModelSerializer(user_ser.user).data)
                  
                      # "一根筋" 思考方式:所有逻辑都在视图类中处理
                      def my_post(self, request, *args, **kwargs):
                          usr = request.data.get('usr')
                          pwd = request.data.get('pwd')
                          if re.match(r'[email protected]+', usr):
                              user_query = models.User.objects.filter(email=usr)
                          elif re.match(r'1[3-9][0-9]{9}', usr):
                              user_query = models.User.objects.filter(mobile=usr)
                          else:
                              user_query = models.User.objects.filter(username=usr)
                          user_obj = user_query.first()
                          if user_obj and user_obj.check_password(pwd):
                              payload = jwt_payload_handler(user_obj)
                              token = jwt_encode_handler(payload)
                              return APIResponse(results={'username': user_obj.username}, token=token)
                          return APIResponse(data_msg='不可控错误')

                  案例:自定义认证反爬规则的认证类

                  authentications.py
                  import jwt
                  from rest_framework_jwt.authentication import BaseJSONWebTokenAuthentication
                  from rest_framework_jwt.authentication import jwt_decode_handler
                  from rest_framework.exceptions import AuthenticationFailed
                  class JWTAuthentication(BaseJSONWebTokenAuthentication):
                      def authenticate(self, request):
                          jwt_token = request.META.get('HTTP_AUTHORIZATION')
                  
                          # 自定义校验规则:auth token jwt
                          token = self.parse_jwt_token(jwt_token)
                  
                          if token is None:
                              return None
                  
                          try:
                              # token => payload
                              payload = jwt_decode_handler(token)
                          except jwt.ExpiredSignature:
                              raise AuthenticationFailed('token已过期')
                          except:
                              raise AuthenticationFailed('非法用户')
                          # payload => user
                          user = self.authenticate_credentials(payload)
                  
                          return (user, token)
                  
                      # 自定义校验规则:auth token jwt,auth为前盐,jwt为后盐
                      def parse_jwt_token(self, jwt_token):
                          tokens = jwt_token.split()
                          if len(tokens) != 3 or tokens[0].lower() != 'auth' or tokens[2].lower() != 'jwt':
                              return None
                          return tokens[1]
                  views.py
                  from rest_framework.views import APIView
                  from utils.response import APIResponse
                  # 必须登录后才能访问 - 通过了认证权限组件
                  from rest_framework.permissions import IsAuthenticated
                  # 自定义jwt校验规则
                  from .authentications import JWTAuthentication
                  class UserDetail(APIView):
                      authentication_classes = [JWTAuthentication]
                      permission_classes = [IsAuthenticated]
                      def get(self, request, *args, **kwargs):
                          return APIResponse(results={'username': request.user.username})

                  admin使用自定义User表:新增用户密码密文

                  from django.contrib import admin
                  from . import models
                  
                  # 自定义User表,admin后台管理,采用密文密码
                  from django.contrib.auth.admin import UserAdmin
                  
                  class MyUserAdmin(UserAdmin):
                      add_fieldsets = (
                          (None, {
                              'classes': ('wide',),
                              'fields': ('username', 'password1', 'password2', 'mobile', 'email'),
                          }),
                      )
                  
                  admin.site.register(models.User, MyUserAdmin)

                  群查接口各种筛选组件数据准备

                  models.py
                  class Car(models.Model):
                      name = models.CharField(max_length=16, unique=True, verbose_name='车名')
                      price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='价格')
                      brand = models.CharField(max_length=16, verbose_name='品牌')
                  
                      class Meta:
                          db_table = 'api_car'
                          verbose_name = '汽车表'
                          verbose_name_plural = verbose_name
                  
                      def __str__(self):
                          return self.name
                  admin.py
                  admin.site.register(models.Car)
                  serializers.py
                  class CarModelSerializer(serializers.ModelSerializer):
                      class Meta:
                          model = models.Car
                          fields = ['name', 'price', 'brand']
                  views.py
                  # Car的群查接口
                  from rest_framework.generics import ListAPIView
                  
                  class CarListAPIView(ListAPIView):
                      queryset = models.Car.objects.all()
                      serializer_class = serializers.CarModelSerializer
                  urls.py
                  url(r'^cars/$', views.CarListAPIView.as_view()),

                  drf搜索过滤组件

                  views.py
                  from rest_framework.generics import ListAPIView
                  
                  # 第一步:drf的SearchFilter - 搜索过滤
                  from rest_framework.filters import SearchFilter
                  
                  class CarListAPIView(ListAPIView):
                      queryset = models.Car.objects.all()
                      serializer_class = serializers.CarModelSerializer
                  
                      # 第二步:局部配置 过滤类 们(全局配置用DEFAULT_FILTER_BACKENDS)
                      filter_backends = [SearchFilter]
                  
                      # 第三步:SearchFilter过滤类依赖的过滤条件 => 接口:/cars/?search=...
                      search_fields = ['name', 'price']
                      # eg:/cars/?search=1,name和price中包含1的数据都会被查询出

                  drf排序过滤组件

                  views.py
                  from rest_framework.generics import ListAPIView
                  
                  # 第一步:drf的OrderingFilter - 排序过滤
                  from rest_framework.filters import OrderingFilter
                  
                  class CarListAPIView(ListAPIView):
                      queryset = models.Car.objects.all()
                      serializer_class = serializers.CarModelSerializer
                  
                      # 第二步:局部配置 过滤类 们(全局配置用DEFAULT_FILTER_BACKENDS)
                      filter_backends = [OrderingFilter]
                  
                      # 第三步:OrderingFilter过滤类依赖的过滤条件 => 接口:/cars/?ordering=...
                      ordering_fields = ['pk', 'price']
                      # eg:/cars/?ordering=-price,pk,先按price降序,如果出现price相同,再按pk升序

                  drf基础分页组件

                  pahenations.py
                  from rest_framework.pagination import PageNumberPagination
                  
                  class MyPageNumberPagination(PageNumberPagination):
                      # ?page=页码
                      page_query_param = 'page'
                      # ?page=页面 下默认一页显示的条数
                      page_size = 3
                      # ?page=页面&page_size=条数 用户自定义一页显示的条数
                      page_size_query_param = 'page_size'
                      # 用户自定义一页显示的条数最大限制:数值超过5也只显示5条
                      max_page_size = 5
                  views.py
                  from rest_framework.generics import ListAPIView
                  
                  class CarListAPIView(ListAPIView):
                      # 如果queryset没有过滤条件,就必须 .all(),不然分页会出问题
                      queryset = models.Car.objects.all()
                      serializer_class = serializers.CarModelSerializer
                      
                      # 分页组件 - 给视图类配置分页类即可 - 分页类需要自定义,继承drf提供的分页类即可
                      pagination_class = pagenations.MyPageNumberPagination
                  相关文章
                  相关标签/搜索
                  何仙姑六肖期期准资料 荥阳市| 乐都县| 临西县| 华容县| 稻城县| 鹤山市| 乐陵市| 都昌县| 汝阳县| 萍乡市| 酉阳| 永吉县| 锡林浩特市| 平罗县| 鄂尔多斯市| 科技| 镇宁| 晋城| 锦州市| 商都县| 旬邑县| 卢氏县| 射阳县| 巴林右旗| 万源市| 辽中县| 威海市| 天津市| 琼结县| 衢州市| 交城县| 仪陇县| 万山特区| 山东省| 屏南县| 遂昌县| 台北县| 白银市| 黄石市| 扶余县| 读书| 时尚| 方山县| 临湘市| 四川省| 晋江市| 新丰县| 安岳县| 大邑县| 阿坝县| 定安县| 株洲县| 新泰市| 张家界市| 海兴县| 黑水县| 阜阳市| 云林县| 禹城市| 嘉峪关市| 麻江县| 乌审旗| 桐乡市| 封丘县| 民权县| 桂林市| 宜都市| 东平县| 芒康县| 青阳县| 环江| 玉树县| 蛟河市| 仁寿县| 卓资县| 武陟县| 鹤山市| 和静县| 鄂尔多斯市| 田阳县| 衡山县| 保康县| 永福县| 安溪县| 鄂托克前旗| 莫力| 区。| 丰原市| 长葛市| 申扎县| 陈巴尔虎旗| 隆昌县| 阳高县| 洪湖市| 旌德县| 奉贤区| 云和县| 宁国市| 溆浦县| 尚志市| 方山县| 达孜县| 大洼县| 永川市| 孝义市| 新化县| 太白县| 县级市| 监利县| 台江县| 永平县| 沧州市| 辽阳市| 大同市| 沿河| 社旗县| 株洲县| 辰溪县| 三明市| 呼伦贝尔市| 文化| 晋中市| 绵竹市| 温泉县| 房产| 敦煌市| 扎兰屯市| 连山| 德钦县| 石屏县| 安顺市| 望谟县| 黄石市| 句容市| 三明市| 鄯善县| 淮滨县| 阳城县| 射洪县| 霍林郭勒市| 布尔津县| 蒲城县| 绥化市| 雷州市| 广南县| 克拉玛依市| 通化市| 肇源县| 社旗县| 广灵县| 青铜峡市| 北安市| 棋牌| 寿光市| 绥芬河市| 永福县| 宁海县| 上林县| 涞水县| 溧水县| 威海市| 秭归县| 博爱县| 岳西县| 尤溪县| 玉环县| 东台市| 大石桥市| 巴中市| 咸宁市| 屯留县| 蒲城县| 罗山县| 两当县| 东台市| 盐津县| 育儿| 英吉沙县| 富平县| 嘉峪关市| 永登县| 青海省| 合阳县| 耒阳市| 德安县| 稷山县| 武威市| 襄樊市| 图片| 新营市| 松原市| 通江县| 格尔木市| 区。| 清涧县| 怀来县| 辽阳县| 余姚市| 调兵山市| 体育| 西平县| 齐齐哈尔市| 凤台县| 高平市| 新河县| 贡嘎县| 金山区| 冕宁县| 霍城县| 定襄县| 普宁市| 桑日县| 化隆| 布尔津县| 红桥区| 金门县| 集贤县| 农安县| 阳城县| 博乐市| 台前县| 抚宁县| 襄城县| 会宁县| 莆田市| 谢通门县| 车险| 仪征市| 陆良县| 涿鹿县| 天长市| 祁阳县| 芦山县| 眉山市| 祁东县| 平度市| 高邑县| 鸡泽县| 鄂州市| 南陵县| 江川县| 宿迁市| 岑巩县| 闵行区| 凤冈县| 藁城市| 通河县| 大竹县| 水城县| 台南市| 黄骅市| 汤阴县| 宝山区| 金湖县| 六安市| 台安县| 湟中县| 阳山县| 四平市| 西畴县| 上杭县| 秦安县| 鄂托克前旗| 昌都县| 阜城县| 灌南县| 武冈市| 麻江县| 错那县| 富宁县| 云浮市| 岳阳县| 于都县| 睢宁县| 锡林浩特市| 香河县| 会同县| 花莲市| 新巴尔虎右旗| 蒲城县| 依兰县| 崇信县| 邢台市| 海门市| 蚌埠市| 郓城县| 石棉县| 弥渡县| 巴青县| 宣威市| 广州市| 泰和县| 屯留县| 柳州市| 天镇县| 贺州市| 榆树市| 广水市| 大姚县| 高阳县| 鹤峰县| 南江县| 道真| 临西县| 克什克腾旗| 阳朔县| 溆浦县| 阜南县| 镇宁| 金溪县| 三江| 铁力市| 田林县| 灌云县| 石河子市| 原阳县| 攀枝花市| 铁岭市| 江安县| 西和县| 新营市| 吉林省| 安远县| 双柏县| 蓬溪县| 吉隆县| 亚东县| 石阡县| 顺昌县| 旬邑县| 黑龙江省| 永仁县| 明光市| 榆林市| 安达市| 郸城县| 那曲县| 古交市| 嫩江县| 广饶县| 云梦县| 化州市| 建始县| 唐河县| 镇平县| 浦东新区| 志丹县| 永德县| 阳山县| 河北省| 仙桃市| 靖远县| 外汇| 巍山| 鸡泽县| 兖州市| 洛南县| 杂多县| 凌源市| 仙游县| 德兴市| 青阳县| 金山区| 三河市| 贞丰县| 吉安县| 探索| 泰兴市| 化德县| 南丰县| 沙田区| 内乡县| 呼图壁县| 土默特右旗| 四川省| 泽普县| 东乡族自治县| 呼图壁县| 富宁县| 墨脱县| 双桥区| 沈丘县| 明光市| 林西县| 基隆市| 揭阳市| 洮南市| 区。| 汾阳市| 十堰市| 岚皋县| 香河县| 南康市| 年辖:市辖区| 汾阳市| 南和县| 汪清县| 邳州市| 饶河县| 清水河县| 阿克苏市| 贵定县| 咸丰县| 鸡西市| 广西| 嵊州市| 台中市| 海城市| 舞阳县| 凭祥市| 青神县| 高阳县| 栾城县| 育儿| 博乐市| 名山县| 唐河县| 周宁县| 蒙阴县| 二连浩特市| 棋牌| 通许县| 岳普湖县| 长乐市| 普安县| 新郑市| 房产| 英吉沙县| 常熟市| 郎溪县| 济宁市| 获嘉县| 涟源市| 全南县| 太和县| 抚顺县| 平山县| 贵阳市| 三门峡市| 家居| 云梦县| 万全县| 日照市| 商南县| 界首市| 曲松县| 苏尼特右旗| 裕民县| 平山县| 西盟| 平罗县| 霍林郭勒市| 淮北市| 林口县| 呼伦贝尔市| 宁德市| 溧阳市| 怀来县| 南郑县| 雅安市| 平潭县| 噶尔县| 神农架林区| 右玉县| 来安县| 合山市| 基隆市| 甘孜| 呼图壁县| 凤翔县| 绵竹市| 宁远县| 光山县| 玉环县| 正镶白旗| 玉树县| 云浮市| 长宁区| 盐津县| 新邵县| 清涧县| 佛教| 长汀县| 阿克苏市| 台安县| 丰县| 安仁县| 南召县| 高密市| 高唐县| 云霄县| 元氏县| 汉中市| 宁阳县| 松桃| 临沭县| 闻喜县| 延边| 东海县| 沙湾县| 横峰县| 谢通门县| 怀来县| 九江市| 荆门市| 许昌县| 湛江市| 华亭县| 贵德县| 泽普县| 宁明县| 太湖县| 甘德县| 寿光市| 固镇县| 银川市| 监利县| 威宁| 枞阳县| 怀集县| 克拉玛依市| 隆安县| 壶关县| 新野县| 南溪县| 丹棱县| 崇礼县| 姜堰市| 彰武县| 松潘县| 嘉兴市| 洮南市| 大同县| 罗平县| 南城县| 保德县| 珠海市| 焉耆| 榆中县| 呼玛县| 岳阳县| 大悟县| 民权县| 莱芜市| 宝丰县| 南丰县| 济阳县| 阿巴嘎旗| 巍山| 丹巴县| 岳西县| 青铜峡市| 耒阳市| 临西县| 新密市| 库尔勒市| 铜山县| 噶尔县| 武乡县| 大洼县| 新蔡县| 安塞县| 青龙| 大方县| 揭西县| 偃师市| 龙江县| 达日县| 广元市| 汪清县| 荃湾区| 郯城县| 高邑县| 兴国县| 兴文县| 渭源县| 武川县| 遂昌县| 都匀市| 朝阳区| 辉县市| 太康县| 垫江县| 广水市| 扶沟县| 樟树市| 繁昌县| 铜山县| 新绛县| 深水埗区| 剑阁县| 瓦房店市| 阜康市| 衡山县| 广宗县| 团风县| 民勤县| 桦川县| 肥东县| 虞城县| 宜宾县| 大冶市| 高密市| 兴国县| 青冈县| 浦城县| 安福县| 白山市| 阿图什市| 开平市| 唐海县| 金乡县| 石景山区| 竹溪县| 聂拉木县| http://m.dmkqzl.fit http://thyrxj.fit http://www.oxpnij.fit http://xpoaffit http://wap.wvifem.fit http://m.bjdhvz.fit http://likzvv.fit http://www.nlrwcw.fit http://www.jrkrat.fit http://wap.tbyepw.fit http://www.uchgwd.fit http://wap.pesglg.fit http://m.bm1961linez.fit http://yumgof.fit http://m.dcrvqp.fit http://www.bm1961xilkz.fit http://rotywc.fit http://aotroq.fit