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是工程名称