2017-01-31 2 views
0

Djangoサーバーでは、機能を開始するボタンが1つのページがあります。 この関数は完了するまでに時間がかかり、別のページからその内容をチェックする目的で、request.session変数にプロセスの更新を書き込もうとしました。 しかし、request.session変数は、それらに含まれる関数が完了するまで更新されないようです。それまで少なくとも変数は更新されません。 私はそうです、もしそうなら、関数の完了前にrequest.session変数に書き込む方法がありますか?関数の前にrequest.session変数を更新する

セッションが正しく設定されているため、他の例で変数を書き込んで読み込むことができます。今のところ、状態更新情報を保存してそこから読み取るための一時的なdbレコードを作成するだけですが、このrequest.sessionの時点で好奇心が強いです - 私の推測は正しいと思いますか?

更新:

views.py

@login_required 
def autolink(request): 
    result, time = access_check(request, 'super') 
    if not result: 
     return redirect('index') 
    result = f_autolink(request) 
    if result is None: 
     result = request.session.get('technical', '') 
    return render(request, 'autolink.html', {'result': result, }) 

functions.py

def f_autolink(request): 
    if request.method == 'GET': 
     result = None 
    elif request.method == 'POST': 
     request.session['technical'] = 'starting the job' 
     result = f_kzd_autolink(request) 
    else: 
     result = None 
    return result 

def f_kzd_autolink(request): 
    homeless = Kzd.objects.filter(payment__isnull=True, returned=False).distinct() 
    result = [] 
    count = homeless.count() 
    counter = 0 
    request.session['technical'] = 'Starting link job - {c} records to process'.format(c=count) 
    for h in homeless: 
     counter += 1 
     request.session['technical'] = 'Checking record {c1} of {c}'.format(c1=counter, c=count) 
/* long code that makes the h in homeless cycle run for about 3 minutes, unrelated to the question */ 

ので、基本的に、図に示すrequest.session.get( '技術'、 '')、いずれの関数も処理が完了するまでそれに書き込みません(最後のレコードの処理について書きます)。

+0

あなたの質問には、[最小限の完全で検証可能な例](http://stackoverflow.com/help/mcve)を含める必要があります。あなたのビューとあなたがすでに試したものを投稿してください。そうすれば、答えを提供するほうがはるかに簡単になります。 – trixn

+0

@trixn申し訳ありません、情報を追加しました。 –

+1

実行時間が長い場合は、セロリ、rqなどの非同期タスクシステムを使用して帯域外で実行したいと考えています。 –

答えて

2

セッションは、modifiedの場合、または設定でsettings.SESSION_SAVE_EVERY_REQUESTTrueに設定されている場合、要求ごとに保存されます。

単純な答えははいです。ビューは、ビューによって作成されたレスポンスを処理するときに、セッションミドルウェアによって保存されます。しかし、ビュー内でrequest.session.save()を呼び出すことで手動で行うことができます。

非常に長く実行されるコードをお持ちの場合は、即時に応答を作成し、celeryのようなツールを使用してタスクを非同期に処理する方がよいでしょう。

実際にユーザーセッションに関連していない場合は、独自のデータベーステーブル/独自のモデルにデータを格納することを検討する必要があります。

+0

素晴らしいです。ありがとう、私はドキュメントから自分自身でそれを理解することができませんでした!セロリとDBについては、はい、私は同意します。これは実際に別のタスクに必要な簡単な修正だったので、私はただちに更新をしたいだけでした。セロリは間違いなく良いだろうが、私はまだそれを使用することを学んでいない。チュートリアルはブックマークバーに座っているので、私はすぐに願っています。 –

関連する問題