Django项目美多商城总结第一天

一:配置(域名和模型类)

 

 

1.使用GenericAPIView+5个ModelMixin的原因:

list

create

retrieve

update

destroy

简化代码:操作不同的模型类时,序列化器与查询集不同,其它代码都相同

提供了属性:

queryset=

serializer_class=

 

  1. 视图类的总结:
    1. APIView:所有代码都需要自己写
    2. GenericAPIView+***ModelMixin:指定查询集和序列化器就行(需要定义两个类)
    3. ModelViewSet:指定查询集和序列化器(只需要定义一个类)

 

  1. DefaultRouter:默认路由规则

配置两条路由规则,一条不带主键,一条带主键

1.router=DefaultRouter()

2.router.register(地址前缀,views.***ViewSet)====>注册生成路由规则

3.urlpatterns+=router.urls

 

  1. 域名的配置
    1. 在etc文件夹下有个文件hosts,进入:sudu vim /etc/hosts

在文件末尾把127.0.0.1替换成网站的域名:127.0.0.1 www.meiduo.site

            127.0.0.1 api.meiduo.site

    1. 在项目文件dev.py中配置ALLOWED_HOSTS=[api.meiduo.site],以后就可以通过这个域名来访问这个Django后端地址

 

  1. 跨域:当前端输入www.meiduo.site时,浏览器会向后端live-server发起一段请求,请求前端文件,然后Ajax请求会向后端Django服务器发送一段请求,请求后端文件,当发起的的get请求时,Django服务器接收到请求,但是不会返回结果,Ajax发送post,put,delete请求之前,会先发送一个options请求的试探,试探这个资源允不允许操作,如果这个options返回一个200OK的话,Ajax再继续发起post,put,delete请求。如果返回的不是200比如是404,就是代表不被允许操作后台,就不会发起请求。这就是跨域过程中js所做的事,js通过Ajax请求后台才会有跨域,才会有这些验证。跨域就是某个域名下的JS通过Ajax请求去请求了另外一个域名下的地址。我们服务器默认是拒绝客户端请求的,如果想要允许请求需要在定义视图的时候写一个options的函数来返回200OK。但是每次都需要自己写就很麻烦,所以我们就借助一个第三方的包叫做CORS(作用就是帮助我们去响应options请求)。

总结什么是跨域:一个域名A下的js通过Ajax请求另外一个域名下的地址,这就是跨域。

 

  1. CORS
    1. 参考文档https://github.com/ottoyiu/django-cors-headers/
    2. 安装:pip install django-cors-headers
    3. 在dev.py中INSTALL_APPS下:

INSTALLED_APPS = (

     ...

     'corsheaders',

     ...

)

    1. 把corsheaders.middleware.CorsMiddleware写在MIDDLEWARE的第一行MIDDLEWARE = [

     'corsheaders.middleware.CorsMiddleware',

     ...

]

    1. 配置一个白名单来判断哪些域名下的JS能访问:

# CORS跨域白名单

CORS_ORIGIN_WHITELIST = (

    'www.meiduo.site:8080', # 表示这个域名下的JS能访问api.meiduo.site

)

CORS_ALLOW_CREDENTIALS = True  # 允许携带cookie

 

  1. 用户模块功能介绍,Django提供的用户模块的文档连接: https://yiyibooks.cn/xx/Django_1.11.6/topics/auth/index.html

自带有用户,权限,组,一个可配置的哈希密码系统,用户登录或内容显示的表单和视图,一个可插拔的后台管理系统

    1. 注册
    2. 登录
    3. 集成QQ授权登录
    4. 个人信息:邮箱激活,最近浏览商品
    5. 收货地址

因为自带的没有手机号验证,所有我们自定义一个User模型:

      • 在apps下的Users下的Model里面定义:

    from django.contrib.auth.models import AbstractUser

      • 在定义一个类继承自AbstractUser:

Class User(AbstractUser):

#如我们要定义手机号,不允许重复就是unique=True

mobile=models.CharField(max_length=11,unique=True)

#定义表的名字

class Meta:

         db_table='tb_users'

         verbose_name='用户'

verbose_name_plural=verbose_name

这里就会出现两个用户类,这时候我们就要选择替换用户类:

AUTH_USER_MODEL = 'users.User'放入dev.py中最下面就行了

 

  1. 模型类设计好之后就要迁移文件了:
    1. 在项目工程目录文件夹打开终端输入:python manage.py makemigrations生成迁移
    2. 再执行迁移:python manage.py migrate
    3. 这时候manage.py就可以跑起来了

 

 

二:业务逻辑

  • 注册:创建一个用户对象
  1. 短信验证码:

业务处理流程

检查是否在60s内有发送记录

生成短信验证码

保存短信验证码redis与发送记录

发送短信

创建一个新应用verifications,在此应用中实现短信验证码

        1. 在apps目录下创建应用(因为短信验证码不只是注册才能用,所以新建)

在apps目录下:python ../../manage.py startapp verifications

在meiduo_sy17目录下打开终端 git add ./

提示:startapp创建出来的应用没有被管理起来,需要手动add

        1. 在verifications新建文件urls,在根级urls中包含进去: url('^',include('verifications.urls'))

要让pycharm知道在apps里面去找包,右键单击apps选择Mark Directory as-->sources Root。

在verifications下的urls中配置:

url(r'^sms_code/(?P<mobile>1[3-9]\d{9})/$',views.SmsAPIview.as_view())

        1. 在verifications下的views.py文件下定义一个视图

from rest_framework.views import APIView # 因为没有涉及模型类操作

from rest_framework.response import Response

from django_redis import get_redis_connection #用redis就需要引入此包

import random # 生成随机数

from meiduo_mall.utils.ytx_sdk.sendSMS import CCP # 发送验证码使用

 

class SmsAPIview(APIView):

    def get(self,request,mobile):

#说明:包含有效时间的设置,推荐向redis中保存数据

#连接redis,参数是caches里面的键

        # 1.验证在60s内是否向此手机号发送过短信,如果发过则返回 (这里就需要接受一个值,在url中已经说明了是mobile)

# 2.如果未发过则继续执行

        # 2.1生成随机6位的验证码

        # 2.2保存验证码,保存发送标记(这里需要定义一个文件)

# 2.2 这里需要与数据库进行两次交互,这步就可以用管道 redis_cli.pipeline操作对象(把命令扔到管道里一次性操作)

(在verifications下新建文件constants里面设置时间变量,短信 验证码和标记)

        # 2.3发送(这里把云通讯SDK文件夹复制到utils里面就行)

        pass

 

在连接redis那步参数连接redis数据库需要在dev文件caches缓存中加入sms (复制session内容名字改成sms),再把数据库名称改成2。再 get_redis_connection(sms)

 

 

  • celery异步:celery是基于python实现的一个异步任务的调度工具,同时还是一个任务列队,主要用于处理耗时的任务。架构如下:

celery架构由三个模块组成:消息中间件(message broker),任务执行单元(worker) 和任务执行结果存储(task result store)组成。

消息中间件(Broker): 消息中间人,是任务调度队列,是一个独立的服务,是一 个生产者消费者模式,生产者把任务放入队列中,消费者(worker)从任务队列中取出 任务执行,任务的执行可以按照顺序依次执行也可以按照计划时间进行。但是Broker 本身不提供队列服务,所以要集成第三方队列,推荐使用RatbbitMQ或Redis.

任务执行单元(worker):即执行任务的程序,可以有多个并发。它实时监控消息 队列,获取队列中调度的任务,并执行它。

任务执行结果存储(task result store):由于任务的执行同主程序分开,如果 主程序想获取任务执行的结果,就必须通过中间件存储。同消息中间人一样,存储也可 以使用RabbitMQ、Redis;另外,假如不需要保存执行的结果也可以不配置这个模块。

 

更对内容参考:

http://docs.celeryproject.org/en/latest/getting-started/introduction.html

 

构成:

  1. 任务------>函数,包含了耗时的代码
  2. 工人------>Worker:新进程,用于处理耗时的代码
  3. 调度人--->broker:负责将任务添加到队列,然后通知工人从列表中取任务
    1. 队列--->queue,存储待执行的任务----------->一般我们用redis 来存储

 

实现:

  1. 把耗时代码定义到目录工程目录下新建一个包celery_tasks
  2. 在celery_tasks包下创建config.py文件,用于保存celery的配置信息

# 指定代理人使用的队列

broker_url='redis://127.0.0.1:6379/14'

  1. 在celery_tasks包下创建main.py文件(运行文件)

from celery import Celery

 

# 为celery使用django配置文件进行设置

import os

 

os.environ['DJANGO_SETTINGS_MODULE'] = "meiduo_mall.settings.dev"

 

# 创建celery应用

app = Celery('meiduo')

 

# 导入celery配置

app.config_from_object('celery_tasks.config')

 

# 自动注册celery任务

app.autodiscover_tasks([

 # 会自动到这个包下加载tasks.py中的任务函数

    'celery_tasks.sms',

])

  1. 在celery_tasks包下创建包sms
    1. 在sms包下创建文件tasks(固定的)
    2. 把耗时任务代码复制到sms包下的tasks.py文件中
    3. 引入celery_tasks下main下的app
    4. 把app用作装饰器加到函数上并指定一个任务的名字name作为参数
  2. 启动celery:

celery -A celery_tasks.main worker -l info

 

  1. 在耗时任务原文件下引入后调用

 # 调用

 send_sms.delay(mobile,sms_code,constants.SMS_EXPIRES/60,1)

 

 

====================总结

能够知道django的认证系统模型类的字段

username

password--->加密

email

新增:mobile

能够按照课件提供的思路自定义用户模型类

1.class User(AbstractUser):

新增属性

2.指定模型类

AUTH_USER_MODEL = 'users.User'

知道如何使用pipeline操作redis

redis_pipeline=redis_cli.pipeline()

redis_pipeline.***()

...

redis_pipeline.execute()

优点:只与redis交互一次

知道如何实现判断短信验证码是否频繁发送

1.在redis中以60秒存储发送标记

2.在发送前先从redis中取值做判断

能够按照课件提供的思路实现celery异步发送短信的任务

上面celery部分的实现

开发过程中,只需要4、5、6、7步

代码:

用户模型类

发短信视图

celery

 

 

 

你可能感兴趣的:(Django项目美多商城总结第一天)