处理跨域请求

主要的思路:

设置一个基于CORS的中间件来处理,关于跨域的产生与处理手段

settings.py:

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'api.cors.CORSMiddleware',
]

cors.py:

class CORSMiddleware(MiddlewareMixin):

def process_response(self,request,response):
# 添加响应头

# 允许你的域名来获取我的数据
# response['Access-Control-Allow-Origin'] = "*"

# 允许你携带Content-Type请求头
# response['Access-Control-Allow-Headers'] = "Content-Type"

# 允许你发送DELETE,PUT
# response['Access-Control-Allow-Methods'] = "DELETE,PUT"
response['Access-Control-Allow-Origin'] = "*"

if request.method == "OPTIONS":
response['Access-Control-Allow-Headers'] = "Content-Type"
response['Access-Control-Allow-Methods'] = "PUT,DELETE"

return response

urls.py:

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/(?P<version>\w+)/', include('api.urls')),
]

1.API汇总

  1. 查询所有的课程

     http://127.0.0.1:8000/api/v1/course/

  1. 查询课程详细

    http://127.0.0.1:8000/api/v1/course/1/

  2. 登陆认证

    http://127.0.0.1:8000/api/v1/auth/

  3. 微学位

    http://127.0.0.1:8000/api/v1/micro/

1.1 课程接口

序列化课程表:

from api import models
from rest_framework import serializers


class CourseSerializer(serializers.ModelSerializer):
"""
课程序列化
"""
level = serializers.CharField(source='get_level_display')

class Meta:
model = models.Course
fields = ['id', 'title', 'course_img', 'level']


class CourseDetailSerializer(serializers.ModelSerializer):
"""
课程详细序列化
"""
# one2one/fk/choice
title = serializers.CharField(source='course.title')
img = serializers.CharField(source='course.course_img')
level = serializers.CharField(source='course.get_level_display')

# m2m
recommends = serializers.SerializerMethodField()
chapter = serializers.SerializerMethodField()

class Meta:
model = models.CourseDetail
fields = ['course', 'title', 'img', 'level',
'slogon', 'why', 'recommends', 'chapter']

def get_recommends(self, obj):
# 获取推荐的所有课程
queryset = obj.recommend_courses.all()

return [{'id': row.id, 'title': row.title} for row in queryset]

def get_chapter(self, obj):
# 获取推荐的所有课程
queryset = obj.course.chapter_set.all()

return [{'id': row.id, 'name': row.name} for row in queryset]

course.py:

from api import models
from rest_framework import serializers


class CourseSerializer(serializers.ModelSerializer):
"""
课程序列化
"""
level = serializers.CharField(source='get_level_display')

class Meta:
model = models.Course
fields = ['id', 'title', 'course_img', 'level']


class CourseDetailSerializer(serializers.ModelSerializer):
"""
课程详细序列化
"""
# one2one/fk/choice
title = serializers.CharField(source='course.title')
img = serializers.CharField(source='course.course_img')
level = serializers.CharField(source='course.get_level_display')

# m2m
recommends = serializers.SerializerMethodField()
chapter = serializers.SerializerMethodField()

class Meta:
model = models.CourseDetail
fields = ['course', 'title', 'img', 'level',
'slogon', 'why', 'recommends', 'chapter']

def get_recommends(self, obj):
# 获取推荐的所有课程
queryset = obj.recommend_courses.all()

return [{'id': row.id, 'title': row.title} for row in queryset]

def get_chapter(self, obj):
# 获取推荐的所有课程
queryset = obj.course.chapter_set.all()

return [{'id': row.id, 'name': row.name} for row in queryset]

urls.py:

    url(r'^course/$', course.CourseView.as_view({'get':'list'})),
url(r'^course/(?P<pk>\d+)/$', course.CourseView.as_view({'get':'retrieve'})),

1.2 登陆认证接口:

要点:

  • 为了保证接口的安全,即使Vue部分已经完成了用户的认证,接口还是需要对Vue的token进行认证。

  • uuid可以用来生成随机字符串,且基于mac地址与时间的组合,安全性较高。此字符串可以用来作为我们的token

account.py

import uuid
class AuthView(APIView):

def post(self,request,*args,**kwargs):
"""
用户登录认证
:param request:
:param args:
:param kwargs:
:return:
"""

ret = {'code':1000}
user = request.data.get('user')
pwd = request.data.get('pwd')

user = models.UserInfo.objects.filter(user=user,pwd=pwd).first()
if not user:
ret['code'] = 1001
ret['error'] = '用户名或密码错误'
else:
# 这里就是利用uuid模块来生成安全性较高的字符串
uid = str(uuid.uuid4())
models.UserToken.objects.update_or_create(user=user,defaults={'token':uid})
ret['token'] = uid
return Response(ret)

1.3 微职位接口

views.py:

class MicroView(APIView):
authentication_classes = [LuffyAuth,]

def get(self,request,*args,**kwargs):
ret = {'code':1000,'title':'微职位'}
return Response(ret)

urls.py:

url(r'^micro/$', course.MicroView.as_view())

luffy项目的接口开发的更多相关文章

  1. flutter 项目中,开发环境、多接口域名、多分支的配置

    flutter 项目中,开发环境.多接口域名.多分支的配置 开发环境:配置成多个入口文件.比如:main.dart.main_develop.dart.main_preview.dart 多域名:每个 ...

  2. 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_20-认证接口开发-接口测试

    测试接口 因为继承了spring  security会拦截这个请求,我们需要写代码 让他对这个认证接口放行 查看代码发现之前已经写过放行的代码了 发现是路径前面少了auth 加断点,测试.申请令牌 r ...

  3. 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_14-认证接口开发-需求分析

    4 认证接口开发 4.1 需求分析 用户登录的流程图如下: 执行流程: 1.用户登录,请求认证服务 2.认证服务认证通过,生成jwt令牌,将jwt令牌及相关信息写入Redis,并且将身份令牌写入coo ...

  4. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_04-新增页面-服务端-接口开发

    api接口定义方法 api的微服务里面.CmsPageControllerApi内定义add方法,返回类型是CmsPageResult CmsPageResult继承了ResponseResult R ...

  5. SpringBoot项目后台对接微信支付开发——微信统一下单接口开发

    开始没找到微信支付的sdk.自己根据官方给的接口文档纯手写,各种xml转JSON,JSON转xml,加密解密,签名....整个人都是崩溃的 开发的第三天,发现有官方的sdk.心情一下子豁然开朗,整个人 ...

  6. luffy项目:基于vue与drf前后台分离项目(1)

    """ 1.业务逻辑:登录注册 - 主页(基础信息展示) - 课程页(复杂信息展示)- 课程订单生产与支付 - 上线订单生成 2.实际项目开发的技术点: git版本控制 ...

  7. git冲突解决、线上分支合并、luffy项目后台登陆注册页面分析引入

    今日内容概要 git冲突解决 线上分支合并 登陆注册页面(引入) 手机号是否存在接口 腾讯云短信申请 内容详细 1.git冲突解决 1.1 多人在同一分支开发,出现冲突 # 先将前端项目也做上传到 g ...

  8. 浅谈 PHP 与手机 APP 开发(API 接口开发) -- 转载

    转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人 一.先简单回答两个问题: 1.PHP 可以开发客户端? 答:不可以,因 ...

  9. 支付宝WAP支付接口开发(Node/Coffee语言)

    此博客不更新很久了, 更新的文档在这, 有兴趣到这里围观: http://neutra.github.io/2013/%E6%94%AF%E4%BB%98%E5%AE%9DWAP%E6%94%AF%E ...

随机推荐

  1. Android Studio 删除多余的虚拟设备(Virtual Device)

    操作系统:Windows 10 x64 IDE:Android Studio 3.2.1 菜单:Tools > AVD Manager 在Android Virtual Device Manag ...

  2. python2.7 (x64) 调用 java 代码实践

    背景:公司实施接口自动化测试,使用的框架python+unittest:因为开发使用的架构师SpringBoot,在测试过程中难免需要使用到python调用JAVA的一些接口,所以需要用到python ...

  3. RabbitMQ在java中基础使用

    RabbitMQ相关术语:          1.Broker:简单来说就是消息队列服务器实体.          2.Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列.      ...

  4. javac选项以递归方式编译给定目录下的所有Java文件 - IT屋-程序员软件开发技术分享社区

    http://www.it1352.com/539276.html #Linux $ find -name“* .java”> sources.txt $ javac @ sources.txt ...

  5. web页在微信中访问增加遮罩层 右上角弹出在浏览器中打开

    https://blog.csdn.net/zgsdzczh/article/details/79744838 web页在微信中访问增加遮罩层 右上角弹出在浏览器中打开   <style typ ...

  6. Windows下80端口被进程System占用的解决方法

    最近电脑时不时就发生了80端口被占用的情况,简单百度解决后,当重启电脑的时候又发生被占用的情况.今天非常幸运的是,发生了80端口和8080端口都被占用了情况,忍无可忍决定下定决心解决这个坑爹的问题,经 ...

  7. Json常用组件

    Json2.js   开发者:json官网:http://www.json.org/. 适用环境:用于在不支持JSON对象的浏览器(通常是国内使用IE内核的第三方浏览器)下使用.json2.js提供了 ...

  8. 【Android】GestureDetector类及其用法

    当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等. 一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouc ...

  9. Migrating your code from 9.3 to 10.x

    刚发现ArcGIS Objects SDK提供了一个代码升级分析工具,用于辅助将程序从9.3升级到10.X:ArcGIS Code Migration Analyzer. 安装sdk后,在vs2010 ...

  10. 伪分布式hbase从0.94.11版本升级stable的1.4.9版本

    Hbase从0.94.11升级到stable的1.4.9版本: 升级思路: hadoop1.1.2    hbase 0.94.11                             ↓ had ...