用django框架开发一个B2C购物网站的基本流程和用到的知识点总结1

开发流程

开发模式采用前后端分离模式,作为后端开发人员我们只关注后端业务逻辑开发:

省略项目框架搭建文件的配置部分。。。。

一:用户部分

在项目开发中我们要用到用户模型类User,Django认证系统提供了用户模型类User和User的相关操作方法;自带的用户模型无法满足我们的要求时需要自定义用户模型添加格外字段;

如:

在创建好的应用models.py中定义用户的用户模型类。

class User(AbstractUser):
  """用户模型类"""
  mobile = models.CharField(max_length=11, unique=True, verbose_name=‘手机号‘)

  class Meta:
  db_table = ‘tb_users‘
  verbose_name = ‘用户‘
  verbose_name_plural = verbose_name

我们自定义的用户模型类还不能直接被Django的认证系统所识别,需要在配置文件中告知Django认证系统使用我们自定义的模型类。

在配置文件中进行设置

AUTH_USER_MODEL = ‘users.User‘
AUTH_USER_MODEL 参数的设置以点.来分隔,表示应用名.模型类名。

用户注册验证码获取接口逻辑设置:

import random

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from django_redis import get_redis_connection

from verifications import constants
from meiduo_mall.libs.yuntongxun.sms import CCP
# Create your views here.

# 获取logger
import logging
logger = logging.getLogger(‘django‘)

# GET /sms_codes/(?P<mobile>1[3-9]\d{9})/
class SMSCodeView(APIView):
  def get(self, request, mobile):
  """
  获取短信验证码:
  1. 生成短信验证码内容
  2. 在redis中保存短信验证码内容,以`mobile`为key,以短信验证码内容为value
  3. 使用云通讯发送短信验证码
  4. 返回应答,发送短信成功
  """
  # 判断60s之内是否给`mobile`发送过短信
  redis_conn = get_redis_connection(‘verify_codes‘)
  send_flag = redis_conn.get(‘send_flag_%s‘ % mobile)

  if send_flag:
    return Response({‘message‘: ‘发送短信过于频繁‘}, status=status.HTTP_400_BAD_REQUEST)

  # 1. 生成短信验证码内容,随机生成一个6位数字
  sms_code = ‘%06d‘ % random.randint(0, 999999)

  # 2. 在redis中保存短信验证码内容,以`mobile`为key,以短信验证码内容为value
  # redis_conn.set(‘<key>‘, ‘<value>‘, ‘<expires>‘)
  # redis_conn.setex(‘<key>‘, ‘<expires>‘, ‘<value>‘)

  # redis管道:可以向管道中添加多个要执行redis命令,然后一次性执行
  pl = redis_conn.pipeline()

  # 向管道添加命令
  pl.setex(‘sms_%s‘ % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
  # 设置一个给`mobile`发送短信的标记
  pl.setex(‘send_flag_%s‘ % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)

  # 执行管道中的命令
  pl.execute()

  # 3. 使用云通讯发送短信验证码
  expires = constants.SMS_CODE_REDIS_EXPIRES // 60
  # try:
  # res = CCP().send_template_sms(mobile, [sms_code, expires], constants.SMS_CODE_TEMP_ID)
  # except Exception as e:
  # logger.error(‘mobile: %s,发送短信异常‘ % mobile)
  # return Response({‘message‘: ‘发送短信异常‘}, status=status.HTTP_503_SERVICE_UNAVAILABLE)
  #
  # if res != 0:
  # # 发送短信失败
  # return Response({‘message‘: ‘发送短信异常‘}, status=status.HTTP_503_SERVICE_UNAVAILABLE)

  # 发出发送短信任务
  from celery_tasks.sms.tasks import send_sms_code
  send_sms_code.delay(mobile, sms_code, expires)

  # 4. 返回应答,发送短信成功
  return Response({‘message‘: ‘OK‘})

用到的知识点:celery异步任务队列

##### 4. celery异步任务队列

本质:

? 使用进程或协程调用函数实现异步。

基本概念:

? 发出者:发出所有执行的任务(任务就是函数)。

? (中间人)任务队列:存放所要执行的任务信息。

? 处理者:也就是工作的进程或协程,负责监听任务队列,发现任务便执行对应的任务函数。

特点:

? 1)任务发送者和处理者可以分布在不同的电脑上,通过中间人进行信息交换。

? 2)任务队列中的任务会进行排序,先添加的任务会被先执行。

使用:

? 1)安装 pip install celery

? 2)创建Celery对象并配置中间人地址

? from celery import Celery

? celery_app = Celery(‘demo‘)

? 配置文件:broker_url=‘中间人地址‘

? celery_app.config_from_object(‘配置文件路径‘)

? 3)定义任务函数

? @celery_app.task(name=‘my_first_task‘)

? def my_task(a, b):

? print(‘任务函数被执行‘)

? ...

? 4)启动worker

? celery -A ‘celery_app文件路径‘ worker -l info

? 5)发出任务

? my_task.delay(2, 3)

遇到的问题:

跨域请求:

当前端与后端分处不同的域名,我们需要为后端添加跨域访问的支持;使用CORS来解决后端对跨域访问的支持(django-cors-headers扩展);

##### 3. 跨域请求

浏览器的同源策略: **协议、主机IP和端口PORT相同的地址是同源,否则是非同源**。

当发起请求的页面地址和被请求的地址不是同源,那么这个请求就是**跨域请求**。

在发起请求时,如果浏览器发现请求是跨域请求,那么在请求的报文头中,会添加如下信息:

> Origin: 源请求IP地址
>
> 例如:Origin: http://www.meiduo.site:8080

在被请求的服务器返回的响应中,如果响应头中包含如下信息:

> Access-Control-Allow-Origin: 源请求IP地址
>
> 例如:Access-Control-Allow-Origin: http://www.meiduo.site:8080

那么浏览器认为被请求服务器支持来源地址对其进行跨域请求,否则认为不支持,浏览器会将请求直接驳回。

解决流程:

安装
pip install django-cors-headers
添加应用
INSTALLED_APPS = (
...
‘corsheaders‘,
...
)
中间层设置
MIDDLEWARE = [
‘corsheaders.middleware.CorsMiddleware‘,
...
]
添加白名单
# CORS
CORS_ORIGIN_WHITELIST = (
‘127.0.0.1:8080‘,
‘localhost:8080‘,
‘www.meiduo.site:8080‘,
)
CORS_ALLOW_CREDENTIALS = True # 允许携带cookie
凡是出现在白名单中的域名,都可以访问后端接口
CORS_ALLOW_CREDENTIALS 指明在跨域访问中,后端是否支持对cookie的操作(未完待续)

原文地址:https://www.cnblogs.com/168vincent/p/9605448.html

时间: 2024-11-29 10:02:55

用django框架开发一个B2C购物网站的基本流程和用到的知识点总结1的相关文章

Django框架开发中避免表单重复提交

Form表单做为web2.0时代的重要角色,也是我们与web网站进行数据交互的重要渠道,但是大家在web网站开发过程中,都会遇到一个问题,那就是如何避免表单重复提交,我们可不确定用户可在提交了一个表单后,是否有足够的耐心等待我们的程序加载完成,如果此时用户不耐烦的在前台重复刷新页面,那么就会造成数据重复提交.信息不准确,因此我们在程序设计时一定要规避这样的问题,接下来介绍一下在Django框架开发中如何避免此问题. 首先说明一下Http协议中两种非常常见的方法GET和POST. 1.GET方法往

用python+django+twistd 开发一个属于自己的运维系统

开源的运维系统不少,比如nagios.zabbix.cati等等,但是遇到自己个性化的运维需求的时候,总是显的力不从心!最近在学习python,所以就考虑用python+django+twisted来定做一个完全个性化的运维系统. 运维系统有几个主要的功能:监控.分析.报警.更甚者直接根据分析的结果进行反应操作.而以上几点通过上述的框架可以比较容易的实现. 下面上图说明: 使用freemind整理了下思路: 下面是一些代码段,完整的代码下载见文档底部: Server: #!/usr/bin/en

SSH2开发简易的购物网站源代码下载

原文:SSH2开发简易的购物网站源代码下载 源代码下载地址:http://www.zuidaima.com/share/1550463431412736.htm 简易的购物网站,采用SSH2 程序的BUG处理方法: 严重: StandardWrapper.Throwable java.lang.IllegalStateException: Cannot initialize context because there is already a root application context p

如何快速开发一个漂亮的网站?包括前端的设计,css布局等

如何快速开发一个漂亮的网站?包括前端的设计,css布局等 网站开发看起来简单,但是做起来很乱,对于个人来说尤其如此.比如,需要ps,css,html,js,java等知识,有什么好的办法,可以快速的开发一个网站的前端? 如今有很多快速开发平台:图形化可视化操作,所见即所得:通过拖拉即可完成表单.流程.报表页面的设计:用户通过编写JS文件,调用封装的单据的保存.查询.删除等方法,即可完成页面的功能设计: 平台工具设计的所有的页面发布后,将生成HTML格式的源码文件,WEB系统采用HTML伪静态技术

jQuery框架开发一个最简单的幻灯效果

在线演示 在这个课程中,我们将介绍如何使用jQuery来开发一个最简单的图片幻灯效果. 立刻观看互动课程:jQuery框架开发一个最简单的幻灯效果 阅读原文:jQuery框架开发一个最简单的幻灯效果 jQuery框架开发一个最简单的幻灯效果

php怎么做网站?如何用PHP开发一个完整的网站?

1.PHPer应具备的知识 (1)PHP知识: 熟练掌握基础函数,PHP语句(条件.循环),数组(排序.读取),函数(内部 构造),运算(数学 逻辑),面向对象(继承 接口 封装 多态静态属性)等. 了解Cookie或者Session一种机制 了解一种模板操作机制和使用 手头收藏一些好的常用类或方法,能提高我们的开发的速度.如:分页.上传.字符过滤.数据库操作.生成HTML.文件操作等. (2)HTML知识 (3)JavaScript事件处理 (4)数据库知识:SQL语句"增删改查"

Python Django 框架开发

参考文档: http://python.usyiyi.cn/django_182/intro/tutorial01.html #Django 1.8.2 文档 http://www.ziqiangxuetang.com/django/django-admin.html #Django 基础教程 1-1.安装Django框架(官网:https://www.djangoproject.com) pip install Django==1.9.1 1-2.创建一个网站项目 django-admin s

使用jQuery图表插件Sparklines来开发一个实用的网站PV(page view)实时监控应用

原文链接:http://www.gbtags.com/gb/share/5820.htm 在线演示 PS:数据有变动.大家看个原理就okay了~ jQuery sparklines是一个jQuery的图表插件,可以帮助你快速构建行内的小图表,今天我们将使用Sparklines开发一个动态监视首页PV变化的应用.希望大家能喜欢,并且多多留言!请点击演示中的"Click ME!!!",查看动态PV变化效果. 如果你不知道什么是jQuery sparklines,请查看如下资源: jQuer

thinkPHP 框架开发极速快三网站开发环境部署运行调试

环境要求 1.极速快三网站开发(Q2222168869) 下载 2.thinkPHP 框架开发各地快三玩法 下载 3.Apache Maven 3.3+ 下载 4.MySql 5.7+ 下载 导入到Eclipse 1.检出JeeSite4源代码: 2.拷贝web文件夹,到你的工作目录(不包含中文和空格的目录)下,重命名为你的工程名,如:jeesite-demo 3.打开pom.xml文件,修改第13行,artifactId为你的工程名,如:<artifactId>jeesite-demo<