python - tornado异步中设置cookie的问题
阿神
阿神 2017-04-17 17:32:09
0
2
439

想通过异步的方式实现一个耗时的任务,但是又想在执行的过程中了解到进度,并且不借助于数据库,目前只能想到用cookie的来确定,但是使用异步的方式,cookie设置总是会出现问题,注意看下面的注释

import tornado.ioloop
import tornado.web
import time
from tornado import gen
from concurrent.futures import ThreadPoolExecutor
import tornado.httpclient
import datetime
import functools

class Executor(ThreadPoolExecutor):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not getattr(cls, '_instance', None):
            cls._instance = ThreadPoolExecutor(max_workers=10)
        return cls._instance


class MainHandler(tornado.web.RequestHandler):
    executor = ThreadPoolExecutor(10)

    @tornado.web.asynchronous
    @tornado.gen.coroutine
    def get(self):
        future = Executor().submit(self.sleep)
        response = yield tornado.gen.with_timeout(datetime.timedelta(10), future, quiet_exceptions = tornado.gen.TimeoutError
        )
        
        self.finish('OK啦')

    @tornado.concurrent.run_on_executor
    def sleep(self):
        self.set_cookie('step1', 'value')   # 这个cookie能设置
        time.sleep(10)
        self.set_cookie('step1', 'value')   # 这个cookie无法设置
        if not self.get_cookie('mycookie'):
            self.set_cookie('mycookie', 'myvalue')
        print('cookie设置完毕')
        return 'OK啦'

class TestHandler(tornado.web.RequestHandler):
    def get(self):
        if not self.get_cookie('mycookie'):
            self.write('没有')
        else:
            self.write('有')

application = tornado.web.Application([
    (r"/", MainHandler),
    (r"/test", TestHandler),
], debug=True)

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
阿神
阿神

闭关修行中......

모든 응답(2)
左手右手慢动作

애플리케이션의 속성을 설정합니다. 값은 사전 또는 이와 유사한 것입니다. 테스트 인터페이스는 이 사전의 상태를 직접 읽습니다. 사전의 상태는 비동기 작업에서 업데이트될 수 있습니다.

브라우저마다 다른 상태가 필요한 경우 쿠키, UID 등을 사용하여 해시를 만드세요.

巴扎黑

진행 상황을 표시하는 인터페이스를 노출하세요. 그렇지 않으면 쿠키가 삭제됩니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿