2010-06-14 2 views
0

я столкнулся вопрос с глобальным переменным, когда я бегом на сервере разработки Джанго он прекрасно работает, но в апаче не работаетпитона глобальный переменный не работает в апаче

здесь код ниже:

red= "/project3/test/" 


def showAddRecipe(request): 
    #global objc 
    if "userid" in request.session: 
     objc["ErrorMsgURL"]= "" 
     try: 
      urlList= request.POST 
      URL= str(urlList['url']) 
      URL= URL.strip('http://') 
      URL= "http://" + URL 

      recipe= __addRecipeUrl__(URL) 

      if (recipe == 'FailToOpenURL') or (recipe == 'Invalid-website-URL'): 
       #request.session["ErrorMsgURL"]= "Kindly check URL, Please enter a valid URL" 
       objc["ErrorMsgURL"]= "Kindly check URL, Please enter a valid URL" 
       print "here global_context =", objc 
       arurl= HttpResponseRedirect("/project3/add/import/") 
       arurl['ErrorMsgURL']= objc["ErrorMsgURL"] 
       #return HttpResponseRedirect("/project3/add/import/") 
       #return render_to_response('addRecipeUrl.html', objc, context_instance = RequestContext(request)) 
       return (arurl) 
      else: 
       objc["recipe"] = recipe 
       return render_to_response('addRecipe.html', 
        objc, 
        context_instance = RequestContext(request)) 
     except: 
      objc["recipe"] = "" 
      return render_to_response('addRecipe.html', 
       objc, 
       context_instance = RequestContext(request)) 
    else: 
     global red 
     red= "/project3/add/" 
     return HttpResponseRedirect("/project3/login") 



def showAddRecipeUrl(request): 
    if "userid" in request.session: 
     return render_to_response('addRecipeUrl.html', 
      objc, 
      context_instance = RequestContext(request)) 
    else: 
     global red 
     red= "/project3/add/import/" 
     return HttpResponseRedirect("/project3/login") 


def showLogin(request): 
    obj = {} 
    obj["error_message"] = "" 
    obj["registered"] = "" 

    if request.method == "POST": 
     if (red == "/project3/test"): 
      next= '/project3/recipes' 
     else: 
      next= red 

     try: 
      username = request.POST['username'] 
      password = request.POST['password'] 
      user = authenticate(username=username, password=password) 
     except: 
      user = authenticate(request=request) 

     if user is not None: 
      if user.is_active: 
       login(request, user) 
       request.session["userid"] = user.id 

       # Redirect to a success page. 
       return HttpResponseRedirect(next) 

этот код отлично работает в сервере разработки Джанго, но в апаче, URL-адрес становится перенаправлен «/ project3/рецепты»

+0

, если вы посмотрите в функции, значение глобальной переменной «красный» устанавливается после того, как сеанс пользователя истек или не вошел в систему, но пытается получить доступ к внутреннему URL-адресу, поэтому я получаю правильное значение глобальной переменной red, т. Е. url, к которому пользователь пытался получить доступ, не будучи входом в систему, при запуске на сервере разработки django, но тот же код не работает на сервере Apache. – Suhail

ответ

3

Я предположил бы, что вы используете возможности CGI Apache. Это означает, что при каждом запросе скрипт запускается заново. Это означает, что глобальная переменная инициализируется каждым вызовом.

Кроме того, на самом деле не рекомендуется использовать глобальные таблицы для хранения, по сути, данных сеанса (с сеансом и, таким образом, для каждого пользователя). Глобалы для всех пользователей одинаковые, а сеансы - для каждого пользователя, чего вы должны (должны) хотеть.

В вашем случае данные сеанса, вероятно, должны храниться в некоторой базе данных, поскольку интерпретатор python завершится, когда ваш скрипт будет завершен, и будет отображаться одна страница.

+0

да, что вы говорите, правильно, но я попытался использовать это, используя сеансы, я попытался использовать request.POST.next и request.POST ['next'], request.GET.net и request.GET ['next'] , но все же все не работало, поскольку они приходили в пустоту. На самом деле, что я пытаюсь сделать, если срок действия какого-либо пользователя илистек, или он не вошел в систему и все еще пытается получить доступ к любому внутреннему URL-адресу, он должен быть перенаправлен на этот URL-адрес после того, как он вошел в систему поэтому я думал об использовании глобальных переменных. – Suhail

+1

Вы должны сохранить URL-адрес в 'request.session.red'. 'request' также является недолговечным объектом (один запрос: браузер -> сервер). –

+0

Привет, Аарон, не могли бы вы объяснить немного больше, я пробовал это, но теперь я получаю сообщение об ошибке, объект «SessionStore» не имеет атрибута «red» – Suhail

0

Как уже говорилось ранее, использование глобальных объектов - это рецепт катастрофы в многопроцессорной среде, такой как живой сайт Apache. У вас будет несколько пользователей, которые будут обращаться к переменным друг друга, и это никогда не будет работать так, как вы хотите.

extraneon правильно, что вы должны использовать сеансы для этого - для чего они предназначены. Из вашего комментария к его ответу очевидно, что вы не читали sessions documentation - вы должны сделать это сейчас.

+0

Эй, Дэниел, спасибо за предложение, проблема решена. – Suhail

0

Эй, ребята, спасибо за помощь, да я знаю, использование глобальных переменный является неправильным способом сделать это, но я не смог заставить его работать, но сейчас его работа, вот код ниже:

def showAddRecipe(request): 
    #global objc 
    if "userid" in request.session: 
     objc["ErrorMsgURL"]= "" 
     try: 
      urlList= request.POST 
      URL= str(urlList['url']) 
      URL= URL.strip('http://') 
      URL= "http://" + URL 

      recipe= __addRecipeUrl__(URL) 

      if (recipe == 'FailToOpenURL') or (recipe == 'Invalid-website-URL'): 
       #request.session["ErrorMsgURL"]= "Kindly check URL, Please enter a valid URL" 
       objc["ErrorMsgURL"]= "Kindly check URL, Please enter a valid URL" 
       print "here global_context =", objc 
       arurl= HttpResponseRedirect("/project3/add/import/") 
       arurl['ErrorMsgURL']= objc["ErrorMsgURL"] 
       #return HttpResponseRedirect("/project3/add/import/") 
       #return render_to_response('addRecipeUrl.html', objc, context_instance = RequestContext(request)) 
       return (arurl) 
      else: 
       objc["recipe"] = recipe 
       return render_to_response('addRecipe.html', 
        objc, 
        context_instance = RequestContext(request)) 
     except: 
      objc["recipe"] = "" 
      return render_to_response('addRecipe.html', 
       objc, 
       context_instance = RequestContext(request)) 
    else: 
     request.session['red']= "/project3/add" 
     return HttpResponseRedirect("/project3/login") 



def showAddRecipeUrl(request): 
    if "userid" in request.session: 
     return render_to_response('addRecipeUrl.html', 
      objc, 
      context_instance = RequestContext(request)) 
    else: 
     request.session['red']= "/project3/add/import" 
     return HttpResponseRedirect("/project3/login") 


def showLogin(request): 
    obj = {} 
    obj["error_message"] = "" 
    obj["registered"] = "" 

    if request.method == "POST": 
     if ('red' not in request.session) or (not request.session["red"]): 
      print "in if " 
      next= '/project3/recipes/' 
     else: 
      print "in else" 
      next= request.session["red"] 

     try: 
      username = request.POST['username'] 
      password = request.POST['password'] 
      user = authenticate(username=username, password=password) 
     except: 
      user = authenticate(request=request) 

     if user is not None: 
      if user.is_active: 
       login(request, user) 
       request.session["userid"] = user.id 

       # Redirect to a success page. 
       return HttpResponseRedirect(next)