Flask의 Celery 비동기 처리
소개
Flask에서 간단한 파이썬 애플리케이션을 만들었습니다. 그래서 비동기 처리를 추가하고 싶습니다.
하지만 거기서 몇 가지 막힐 포인트가 있었기 때문에 기사로 했습니다.
첫째, 앞서 말할 수있는 것은 파이썬에서의 비동기 처리는 Flask가 아닌 프레임 워크가 더 좋을 수 있다는 것입니다. 구그하고 있으면 다른 프레임워크 쪽이 정보가 많이 느꼈습니다.
실행 내용
사용자가 텍스트 상자에 두 개의 숫자를 입력하고 버튼을 누릅니다.
서버측은 2개의 숫자를 더하는 조작을 비동기 처리로 실시해, 유저에게의 응답을 곧바로 돌려준다.
실행 환경
os: Windows10
redis Redis-x64-3.0.504.msi
파이썬 3.5.6 (아나콘다)
Flask==1.1.1
celery==3.1.25
redis==2.10.6
실행 절차
사용자가 텍스트 상자에 두 개의 숫자를 입력하고 버튼을 누릅니다.
서버측은 2개의 숫자를 더하는 조작을 비동기 처리로 실시해, 유저에게의 응답을 곧바로 돌려준다.
실행 환경
os: Windows10
redis Redis-x64-3.0.504.msi
파이썬 3.5.6 (아나콘다)
Flask==1.1.1
celery==3.1.25
redis==2.10.6
실행 절차
이마즈키 포인트
( "celery -A sample.celery worker -l info"를 실행 한 터미널에서 확인 가능)
결론
간단하지만 아래에 sample.py, main.html을 첨부했습니다. 이 두 파일로 이동합니다. 참고로 한 사이트의 URL도 첨부해 두었습니다.
뭔가 질문, 실수가 있으면 꼭 코멘트 부탁드립니다.
소스 코드
sample.py# coding=utf-8
from flask import Flask, render_template, request
# Flaskアプリ準備
app = Flask("sample")
# this is a part of celery property to use in Flask
from celery import Celery
def make_celery(app):
celery = Celery(
app.import_name,
backend=app.config['CELERY_RESULT_BACKEND'],
broker=app.config['CELERY_BROKER_URL']
)
celery.conf.update(app.config)
class ContextTask(celery.Task):
def __call__(self, *args, **kwargs):
with app.app_context():
return self.run(*args, **kwargs)
celery.Task = ContextTask
return celery
# update flask config to use celery
app.config.update(
CELERY_BROKER_URL='redis://localhost:6379',
CELERY_RESULT_BACKEND='redis://localhost:6379'
)
celery = make_celery(app)
@celery.task()
def add(a, b):
print(a + b)
return a + b
@app.route('/', methods=["GET", "POST"])
def sample():
# POST時の処理
if request.method == 'POST':
return render_template(
'main.html', # 表示するHTMLファイル
)
# GET時の処理
else:
return render_template(
'main.html', # 表示するHTMLファイル
)
@app.route('/celery', methods=["POST"])
def celery_test():
if request.method == 'POST':
a = int(request.form["num_one"])
b = int(request.form["num_two"])
result = add.delay(a,b)
return render_template(
'main.html', # 表示するHTMLファイル
)
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=9000)
main.html<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8"/>
<title>Sample</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="jumbotron">
<h1>
<p align="center">
<font size="10">Flask 非同期処理</font>
</p>
</h1>
</div>
<form class="" method="post" action="/celery" enctype="multipart/form-data">
<div class="container" style="text-align: center;">
<input type="number" name="num_one"> +
<input type="number" name="num_two">
</div>
<div class="button_wrapper" style="text-align: center;">
<button type="submit" class="btn btn-lg btn-success" style="margin-top: 50px; ">計算実行</button>
</div>
</form>
</div>
</body>
</html>
참고문헌
Windows용 Redis를 설치하고 만져보세요
ㅡtp://카케우라. 하테나아 ry. jp
Flask 공식
htps // f sk. 파트 tsp 로지 cts. 코 m/엔/1.0. x / 파테 rs s / 세이 ry /
python – Celery Worker를 시작할 수 없음
htps // 코데다 y. Me / jp / Ku / 20190525 / 900758. HTML
celery AttributeError: 'str' object has no attribute 'items' django Day14
h tp // w w. p로g 라메 r 그래 ght. 코 m/아리치 cぇ/8120463251/
Reference
이 문제에 관하여(Flask의 Celery 비동기 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/chi-na/items/c72fcae5af44cb647007
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# coding=utf-8
from flask import Flask, render_template, request
# Flaskアプリ準備
app = Flask("sample")
# this is a part of celery property to use in Flask
from celery import Celery
def make_celery(app):
celery = Celery(
app.import_name,
backend=app.config['CELERY_RESULT_BACKEND'],
broker=app.config['CELERY_BROKER_URL']
)
celery.conf.update(app.config)
class ContextTask(celery.Task):
def __call__(self, *args, **kwargs):
with app.app_context():
return self.run(*args, **kwargs)
celery.Task = ContextTask
return celery
# update flask config to use celery
app.config.update(
CELERY_BROKER_URL='redis://localhost:6379',
CELERY_RESULT_BACKEND='redis://localhost:6379'
)
celery = make_celery(app)
@celery.task()
def add(a, b):
print(a + b)
return a + b
@app.route('/', methods=["GET", "POST"])
def sample():
# POST時の処理
if request.method == 'POST':
return render_template(
'main.html', # 表示するHTMLファイル
)
# GET時の処理
else:
return render_template(
'main.html', # 表示するHTMLファイル
)
@app.route('/celery', methods=["POST"])
def celery_test():
if request.method == 'POST':
a = int(request.form["num_one"])
b = int(request.form["num_two"])
result = add.delay(a,b)
return render_template(
'main.html', # 表示するHTMLファイル
)
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=9000)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8"/>
<title>Sample</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="jumbotron">
<h1>
<p align="center">
<font size="10">Flask 非同期処理</font>
</p>
</h1>
</div>
<form class="" method="post" action="/celery" enctype="multipart/form-data">
<div class="container" style="text-align: center;">
<input type="number" name="num_one"> +
<input type="number" name="num_two">
</div>
<div class="button_wrapper" style="text-align: center;">
<button type="submit" class="btn btn-lg btn-success" style="margin-top: 50px; ">計算実行</button>
</div>
</form>
</div>
</body>
</html>
Reference
이 문제에 관하여(Flask의 Celery 비동기 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/chi-na/items/c72fcae5af44cb647007텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)