1,跨域:是浏览器的同源策略

  • 阻止ajax请求不组织src请求

2,一个源的定义:如果两个页面的协议,端口(如果由指定)和域名都相同,则两个页面具有相同的源

下面给出相对http://a.xyz.com/dir/page.html同源检测的示例

URL 结果 原因
http://a.xyz.com/dir2/other.html 成功  
http://a.xyz.com/dir/inner/another.html 成功  
https://a.xyz.com/secure.html 失败 不同协议(http和https)
http://a.xyz.com:81/dir/etc.html 失败 不同端口(81和80)
http://z.opq.com/dir/other.html 失败 不同域名(xyz和opq)

3,同源策略是什么

同源策略是浏览器的一个安全功能,不同源的客户脚本在没有明确授权的情况下,不能读写对方资源,所以xyz.com下的js脚本采用abc.com里面的文件数据是会被拒绝的

同源策略限制了同一个源加载的文档或脚本如何与来自另一个源的资源进行交互,这是一个用于隔离潜在恶意文件的重要机制

4,不受同源策略限制

  1. 页面中的连接,重定向以及表单提交时不会受到同源策略限制的
  2. 跨域资源的引入是可以的,但是js不能读写加载的内容,如嵌入式到页面中<script src=" "></script>, <img>, <link>, <iframe>等

5,CORS跨域请求

CORS即Cross Resource Sharing跨域资源共享

那么跨域请求还分两种,一种是简单请求,一种是复杂请求~~~

5.1>简单请求

HTTP方法是下列方法之一

  • HEAD GET POST

HTTP头信息不超过以下几种字段

  • Accept, Accept-Language, Last-Event-ID
  • Content-Type只能是以下类型中的一个
    • application/x-www-from-urlencoded
    • multipart/form-data
    • text/plain

任何一个不满足上述要求的请求,即会被认为是复杂请求~~

复杂请求会发出一个预请求,我们也叫预检, OPTIONS请求~~

5.2>浏览器的同源策略

  • 跨域是因为浏览器的同源策略导致的,也就是说浏览器会阻止非同源的请求~~
  • 那什么是非永远呢~~即域名不同,端口不同属于非同源的~~~
  • 浏览器只阻止表单以及ajax请求,并不会阻止src请求,所以我们的cnd,图片等src请求都可以发~~

5.3>解决跨域

  • JSONP:jsonp的实现是根据浏览器不阻止请求入手~来实现的~~
class Test(APIView):

    def get(self, request):
callback = request.query_params.get("callback", "")
ret = callback + "(" + "'success'" + ")"
return HttpResponse(ret)

jsonp的前端ajax代码

<button id="btn_one">点击我向JsonP1发送请求</button>
<script>
// 测试发送请求失败 跨域不能得到数据
$('#btn_one').click(function () {
$.ajax({
url: "http://127.0.0.1:8000/jsonp1",
type: "get",
success: function (response) {
console.log(response)
}
})
}); function handlerResponse(response) {
alert(response)
}; window.onload = function () {
$("#btn_one").click(function () {
let script_ele = document.createElement("script");
script_ele.src = "http://127.0.0.1:8000/jsonp1?callback=handlerResponse";
document.body.insertBefore(script_ele, document.body.firstChild);
})
} </script>

jsonp解决跨域只能发送get请求,并且实现起来需要前后端交互比较多

  • 添加响应头
from django.utils.deprecation import MiddlewareMixin

class MyCors(MiddlewareMixin):
def process_response(self, request, response):
response["Access-Control-Allow-Origin"] = "*"
if request.method == "OPTIONS":
# 复杂请求会先发预检
response["Access-Control-Allow-Headers"] = "Content-Type"
response["Access-Control-Allow-Methods"] = "PUT,PATCH,DELETE"
return response

6,ContentType组件

  • 需求
  • 现在我们有这样一个需求~我们的商城里有很多的商品~~节目要来了~~我们要搞活动~~
  • 那么我们就要设计优惠券~~优惠券都有什么类型呢~~满减的~折扣的~立减的~~
  • 我们对应着我们活动类型~对我们的某类商品设计优惠券~~比如~~
  • 家电是一类商品~~实物是一类商品~那么我们可以设计家电折扣优惠券~以及实物满减优惠券等
  • 那么表结构怎么设计~~

代码如下:

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation # Create your models here. class Food(models.Model):
"""
id name
1 酱香饼
2 鸡蛋饼
3 水煎包
"""
name = models.CharField(max_length=32)
# 反向查询用
coupons = GenericRelation(to="Coupon") class Fruit(models.Model):
"""
id name
1 红心蜜柚
2 黑美人西瓜
"""
name = models.CharField(max_length=32)
# 反向查询用
coupons = GenericRelation(to="Coupon") # class Table(models.Model):
"""
第一版
id title food_id fruit_id....
1 酱香饼买一送一 1 null
2 黑美人西瓜2折 null 2
"""
# title = models.CharField(max_length=32)
# # 第一版设计
# food = models.ForeignKey(to="Food")
# fruit = models.ForeignKey(to="Fruit")
#
#
# class MyTable(models.Model):
"""
id app_name table_name
1 Demo Food
2 Demo Fruit
"""
# # 第二版设计
# table = models.ForeignKey(to="MyTable")
# object_id = models.IntegerField()
# app_name = models.CharField(max_length=32)
# table_name = models.CharField(max_length=32) class Coupon(models.Model):
"""
第三版
id title table_id object_id
1 酱香饼买一送一 1 1
2 黑美人西瓜2折 2 2
"""
# 第三版用django自带的ContentType表
title = models.CharField(max_length=32)
# content_type和ContentType表外键关联ContentType表是django自带的表
content_type = models.ForeignKey(to=ContentType)
object_id = models.IntegerField()
# 不会生成字段,只用于关联到对象的
content_object = GenericForeignKey("content_type", "object_id")

遇到这种情况,一张表跟多种表外键关联的时候, Django就提供了ContentType组件~

ContentType是Django的内置的一个应用,可以追踪项目中所有的app和model的对应关系,并记录ContentType表中.

当我们的项目做数据库迁移的后,会有很多自带的表,其中就有django_content_type表.

  • ContentType组件的作用:

    • 在model中定义ForeiginKey字段,并关联到ContentType表,通常这个字段命名为content-type
    • 在model中定义PositiveIntergerField字段,用来存储关联表中的主键,通常我们用object_id
    • 在model中定义GenericForeignKey字段,传入上面两个字段的名字
    • 方便反向查询可以定义GenericRelation字段

视图函数的代码如下:

from django.shortcuts import render
from rest_framework.views import APIView
from django.http import HttpResponse
from .models import Food, Fruit, Coupon
from django.contrib.contenttypes.models import ContentType # Create your views here. class TestView(APIView):
def get(self, request):
# 找到表id以及表对象
# content_type_obj = ContentType.objects.filter(app_label="Demo", model="food").first()
# print(type(content_type_obj))
# model_class = content_type_obj.model_class()
# print(model_class)
# print(content_type_obj.id)
# 给酱香饼创建优惠券
food_obj = Food.objects.filter(id=1).first()
Coupon.objects.create(title="酱香饼买一送小威",content_object=food_obj)
# 给黑美人加优惠券
# fruit_obj = Fruit.objects.get(id=2)
# Coupon.objects.create(title="黑美人2折", content_type_id=9, object_id=2)
# 查询优惠券绑定对象
# coupon_obj = Coupon.objects.filter(id=1).first()
# print(coupon_obj.content_object.name)
# 查某个对象的优惠券
food_obj = Food.objects.filter(id=1).first()
print(food_obj.coupons.all())
return HttpResponse("ok")

跨域,Content-Type组件的更多相关文章

  1. 利用javascript跨域访问cookie之广告推广

    在上一篇<说一说javascript跨域和jsonp>中,利用JSONP进行了跨域的数据访问,利用JS本身的跨域能力在远端生成HTML结构的方式完成了一个小广告. 在实际应用中, 跨域使用 ...

  2. MVC+Jsonp实现跨域交互

    一.认识Jsonp JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式 ...

  3. C# 和Jsonp的一个小demo 用jQuery与JSONP轻松解决跨域访问的问题

    客服端:      在A项目下面 建立一个 JsonpClient.aspx页面,代码如下: <%@ Page Language="C#" AutoEventWireup=& ...

  4. JavaScript和ajax 跨域的案例

    今天突然想看下JavaScript和ajax 跨域问题,然后百度看了一下,写一个demo出来 <!DOCTYPE html> <html xmlns="http://www ...

  5. 跨域处理之Jsonp

    一.认识Jsonp JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式 ...

  6. 如何通过js跨域调用ASP.NET Web API (请问如何实现在javascript中通过http get的方式跨域调用ASP.NET Web API?)

    客户端js无需任何专门设置,使用通常的ajax调用即可: $.ajax({ url: '跨域URL', type: 'get', dataType: 'json', success: function ...

  7. jquery怎么实现跨域的访问呢?与别人提供的接口连接

    下面这个例子你可以参考下 <script> $.ajax({ async:false, url: 'http://www.mysite.com/demo.do',  // 跨域URL ty ...

  8. Asp.Net WebApi+Microsoft.AspNet.WebApi.Core 启用CORS跨域访问

    WebApi中启用CORS跨域访问 1.安装 Nugget包Microsoft.AspNet.WebApi.Cors This package contains the components to e ...

  9. jquery跨域访问解决方案(转)

    客户端“跨域访问”一直是一个头疼的问题,好在有jQuery帮忙,从jQuery-1.2以后跨域问题便迎刃而解.由于自己在项目中遇到跨域问题,借此机会对跨域问题来刨根问底,查阅了相关资料和自己的实践,算 ...

  10. 前端总结·基础篇·JS(四)异步请求及跨域方案

    前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...

随机推荐

  1. 条款10:令operator=返回一个reference to * this(Have assignment operators return a reference to *this)

    NOTE: 1.令赋值(assignment)操作符返回一个reference to *this. 2.此协议适用于所有赋值相关的运算比如:+= -= *=....

  2. python基础知识03-格式化输出和深浅复制

    VIM中HJKL可以上下左右移动光标. 格式化输出和深浅复制 1.字符串的拼接和格式化 sudo pip3 install ipython 安装 ipython 进入 字符串相加 str1 + str ...

  3. Python中的函数(3)

    一.包含返回值的函数 下面来看一个函数,它接收名和姓并返回完整的姓名: def get_formatted_name(first_name,last_name): """ ...

  4. 使用js获取页面的各种高度

    使用js获取相关高度: 获取网页被滚动条卷去的高度——兼容写法: scrollHeight = documen.body.scrollTop || document.documentElement.s ...

  5. 剑指Offer(书):用两个栈实现队列

    题目:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 分析:入栈时只入栈1,出栈为栈2:若栈2不为空,直接出栈:否则,将栈1中的值依次入栈2,之后栈2出栈 Sta ...

  6. c和c++如何把一个整数转化为string

    c和c++如何把一个整数转化为string C++: 一.string转int的方式 采用最原始的string, 然后按照十进制的特点进行算术运算得到int,但是这种方式太麻烦,这里不介绍了. 采用标 ...

  7. NLS_LANG在客户端不能确定,字符集转变将造成不可预期的后果

    原因:1,没有客服端配置字符集2,客户端字符集跟服务端字符集不一致 解决:1,打开plsql 帮助-支持信息看看uls_lang是否设置 2,查看服务器端字符集 Select *from V$NLS_ ...

  8. dfs树上的边

    by   GeneralLiu 一 开 始 学 tarjan 的 强连通分量 , 割边 , 割点 时 没有 学扎实 经过培训 ,发现了些 需要注意的 小细节 举个荔枝 dfs树 上的 边 学了 tar ...

  9. Flume+kakfa+sparkStream实时处理数据测试

    flume:从数据源拉取数据 kafka:主要起到缓冲从flume拉取多了的数据 sparkStream:对数据进行处理   一.flume拉取数据   1.源数据文件读取配置   在flume目录的 ...

  10. 转载:用vector保存对象时保存指针的优点, 以及reserve的使用

    #include <vector> #include <stdio.h> class A { public: A() { printf("A()/n"); ...