cors跨域&celery

cors跨域&celery

一.cors跨域

1. 什么是跨域
跨域(跨源)是指浏览器从一个源的网页去请求另一个源,源指的是域名、端口、协议

以下都属于跨域问题
域名: 
    主域名不同: http://www.baidu.com/index.html –> http://www.sina.com/test.js 
    子域名不同: http://www.666.baidu.com/index.html –> http://www.555.baidu.com/test.js 
    域名和域名ip: http://www.baidu.com/index.html –>http://180.149.132.47/test.js 
端口: 
	http://www.baidu.com:8080/index.html–> http://www.baidu.com:8081/test.js 
协议: 
	http://www.baidu.com:8080/index.html–> https://www.baidu.com:8080/test.js 

2. 为什么要考虑跨域问题
因为Ajax不能跨域, 一旦客户端和服务端的不在一台服务器, 则需要考虑跨域访问的问题
3. 同源策略
同源策略是浏览器的一项最为基本同时也是必须遵守的安全策略。
同源策略的存在,限制了“源”自A的脚本只能操作“同源”页面的DOM,“跨源”操作来源于B的页面将会被拒绝。
所谓的“同源”,必须要求相应的URI的域名、端口、协议均是相同的。
4. 使用Ajax发送请求的方式
//js
xhr = new XMLHttpRequest();
xhr.open('get', 'http://127.0.0.1:8000/app/getdata/', true);
xhr.send();
xhr.onreadystatechange = function () {
  	if (xhr.readyState==4 && xhr.status==200){
      	console.log(JSON.parse(xhr.responseText))
  	}
}

//jq
$.ajax({
  	type: "get",
  	url: 'http://127.0.0.1:8000/app/getdata/',
    data: {},
    async: true,

    success: function (data) {
      	console.log(data);
    },
    error: function (e) {
      	console.log(e);
    }
})

// get请求
$.get("http://127.0.0.1:8000/app/getdata/", function (data) {
	console.log(data);
});

// post请求 【csrf验证】
$.ajaxSetup({
	data:{csrfmiddlewaretoken:'{{ csrf_token }}'}
});

$.post("http://127.0.0.1:8000/app/getdata/", function (data) {
	console.log(data);
})

5. 解决跨域问题
方式一: 使用 JSONP (一种非Ajax技术,需要前后端同时支持)
<script src='http://www.baidu.com/getdata/'></script>
方式二: 让服务器支持跨域(推荐)
Django支持跨域
安装django-cors-headers
	pip install django-cors-headers
配置settings.py文件
	INSTALLED_APPS = [
        'corsheaders']

    MIDDLEWARE = (
        'corsheaders.middleware.CorsMiddleware',
        'django.middleware.common.CommonMiddleware', 
    )
    # 跨域增加忽略
    CORS_ALLOW_CREDENTIALS = True
    CORS_ORIGIN_ALLOW_ALL = True
	
    # 跨域允许的请求方式(可选)
    CORS_ALLOW_METHODS = (
        'DELETE',
        'GET',
        'OPTIONS',
        'PATCH',
        'POST',
        'PUT',
    )
	
    # 跨域允许的头部参数(可选)
    CORS_ALLOW_HEADERS = (
        'XMLHttpRequest',
        'X_FILENAME',
        'accept-encoding',
        'authorization',
        'content-type',
        'dnt',
        'origin',
        'user-agent',
        'x-csrftoken',
        'x-requested-with',
        'Pragma',
    )

二.celery

1. celery介绍
Celery - 分布式任务队列. Celery 是一个简单、灵活且可靠的, 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery.
使用场景:
	1.你想执行一个操作,可能会花很长时间,但你不想让你的程序一直等着结果返回,而是想有创建一个任务,这个任务会在其他地方执行,执行完毕后会你拿到结果, 在任务执行过程,你可以继续做其它的事情。 
	2.你想做一个定时任务,比如每个星期五发送一条会议通知.

Celery它是一个专注于实时处理的任务队列,同时也支持任务调度.

Celery是基于Python开发的一个分布式任务队列框架,支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度.

[外链图片转存失败(img-kjC8T19L-1565224726425)(./celery.png)]

Celery 主要包含以下几个模块:
1.任务模块 Task
	包含异步任务和定时任务。其中,异步任务通常在业务逻辑中被触发并发往任务队列,而定时任务由 Celery Beat 进程周期性地将任务发往任务队列。
2.消息中间件 Broker
	Broker,即为任务调度队列,接收任务生产者发来的消息(即任务),将任务存入队列。Celery 本身不提供队列服务,官方推荐使用 RabbitMQ 和 Redis 等。
3.任务执行单元 Worker
	Worker 是执行任务的处理单元,它实时监控消息队列,获取队列中调度的任务,并执行它。
4.任务结果存储 Backend
	Backend 用于存储任务的执行结果,以供查询。同消息中间件一样,存储也可使用 RabbitMQ, redis 和 MongoDB 等。
2.安装celery
创建虚拟环境
	mkvirtualenv celeryenv
使用pip安装
	pip install celery
使用celery
创建python工程, 然后新建tasks.py文件, 写入以下代码
from celery import Celery

# 创建celery对象,设置任务队列使用redis
app = Celery('tasks', broker='redis://localhost:6379')

# 创建任务
@app.task
def add(a, b):    
    time.sleep(5)    
    n = a + b    
    print(n)    
    return n

if __name__ == '__main__':
    # add(10, 5)    
    # 调用任务
    add.delay(10, 5)
    print('程序执行结束')
    
启动celery服务
linux:
	celery -A tasks worker --loglevel=info
windows:
    pip install eventlet
    celery -A tasks worker --loglevel=info -P eventlet
redis操作:
安装redis
	pip install redis
启动redis服务
	redis-server
启动redis客户端:
	redis-cli
Django中使用celery
安装celery
pip install celery
安装redis
pip install redis
安装sqlalchemy
pip install sqlalchemy
启动celery服务
celery -A proj worker -l info
注意: proj是工程名称
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值