请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同.
比如:我在本地上的域名是127.0.0.1:8000,请求另外一个域名:127.0.0.1:8001一段数据
浏览器上就会报错,这个就是同源策略的保护,如果浏览器对javascript没有同源策略的保护,那么一些重要的机密网站将会很危险
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能实现CORS通信的关键是服务器。只要服务器实现了CORS,就可以跨源通信
Redis支持五大数据类型
使用Redis的好处
Redis对比memcached
Redis特点
Redis单线程为什么这么快(官方:10w左右并发,实际:6w左右并发)
服务:客户端,服务端(跟MySQL一样,是存数据的地方)
安装
启动Redis服务
客户端连接
普通连接
#redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-pyimportredisconn=redis.Redis(host='127.0.0.1',port=6379)conn.set('foo','Bar')print(r.get('foo'))连接池
#redis-py使用connectionpool来管理对一个redisserver的所有连接,避免每次建立、释放连接的开销#默认:每个Redis实例都会维护一个自己的连接池#可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池importredispool=redis.ConnectionPool(host='127.0.0.1',port=6379)conn=redis.Redis(connection_pool=pool)conn.set('foo','Bar')print(r.get('foo'))把POOL以单例形式使用
#pool.pyimportredis#拿到一个连接数为3的连接池#把POOL做成单例:把它以模块导入方式POOL=redis.ConnectionPool(max_connections=3,host='127.0.0.1',port=6380)========================================================================================importredisfrompoolimportPOOL#以模块形式导入,是天然单例conn=redis.Redis(connection_pool=POOL)#conn2=redis.Redis(connection_pool=POOL)#conn3=redis.Redis(connection_pool=POOL)#conn4=redis.Redis(connection_pool=POOL)#conn5=redis.Redis(connection_pool=POOL)#conn6=redis.Redis(connection_pool=POOL)conn.set('age',19)conn.close()#不是关闭连接,把该连接,放回到连接池Redis五大数据类型之字符串字符串操作,Redis中的字符串再内存中按照一个name对应一个value来存储
#安装:pipinstallcelery#win上启动work#4.x版本及之前pipinstalleventletceleryworker-Acelery_task-linfo-Peventlet#5.x版本pipinstalleventletcelery-Acelery_taskworker-linfo-Peventlet#linux中启动workceleryworker-Acelery_task-linfocelery-Acelery_taskworker-linfo#启动beat的命令(负责每隔几秒钟,向任务队列中提交任务)celerybeat-Acelery_task-linfo普通使用新建celery_task.py(任意名字)
fromceleryimportCelerybackend='redis://127.0.0.1:6379/1'#结果存储broker='redis://127.0.0.1:6379/2'#消息中间件app=Celery('test',broker=broker,backend=backend)#传一个字符串,相当于名字@app.taskdefadd(a,b):#很耗时的任务importtimetime.sleep(3)returna+b新建add_task.py添加任务
fromcelery_taskimportadd#res=add(1,2)#同步调用res=add.delay(3,4)#把任务提交到redis,返回要给uuid:b20f827d-dcf5-4fdf-a646-5abb963dc1d3print(res)新建get_result.py查询任务
fromcelery_taskimportapp#自己写的appfromcelery.resultimportAsyncResult#celery模块下的id='b20f827d-dcf5-4fdf-a646-5abb963dc1d3'if__name__=='__main__':a=AsyncResult(id=id,app=app)ifa.successful():result=a.get()#task中return的数据:7print(result)elifa.failed():print('任务失败')elifa.status=='PENDING':print('任务等待中被执行')elifa.status=='RETRY':print('任务异常后正在重试')elifa.status=='STARTED':print('任务已经开始被执行')启动worker
###有app的这个py文件,必须叫celeryfromceleryimportCelerybackend='redis://127.0.0.1:6379/1'#结果存储broker='redis://127.0.0.1:6379/2'#消息中间件app=Celery('test',broker=broker,backend=backend,include=['celery_task.home_task','celery_task.order_task','celery_task.user_task'])#定制定时任务#时区(修改时区)print(app.conf)app.conf.timezone='Asia/Shanghai'#是否使用UTCapp.conf.enable_utc=False#任务的定时配置fromdatetimeimporttimedeltafromcelery.schedulesimportcrontabapp.conf.beat_schedule={'send_sms_5':{'task':'celery_task.user_task.send_sms',#要执行的任务'schedule':timedelta(seconds=5),#'schedule':crontab(hour=8,day_of_week=1),#每周一早八点'args':(189533333,),},'add_3':{'task':'celery_task.home_task.add',#要执行的任务'schedule':timedelta(seconds=3),#'schedule':crontab(hour=8,day_of_week=1),#每周一早八点'args':(6,8),}}home_tesk.py
from.celeryimportapp@app.task#home模块的任务defadd(a,b):returna+border_task.py
from.celeryimportapp@app.task#order模块的任务,写文件任务defwrite_file(s):withopen(r'D:\lqz2\luffy_api\log\a.txt','w',encoding='utf-8')asf:f.write(s)returnTrue