2010-06-14 4 views
0

Je suis face à problème avec la variable globale, quand je lance dans le serveur de développement django il fonctionne très bien, mais apache ne fonctionne paspython ne fonctionne pas dans apache

est le code ci-dessous:

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) 

ce code fonctionne très bien dans le serveur de développement django, mais apache, l'URL est se redirigé vers «/projet3/recettes »

+0

si vous regardez dans les fonctions la valeur de la variable globale 'rouge' est définie après que la session des utilisateurs a expiré ou n'est pas connecté mais essaye d'accéder à l'URL interne, ainsi j'obtiens la valeur correcte de la variable globale rouge, c.-à-d. l'URL à laquelle l'utilisateur essayait d'accéder sans être connecté, lors de l'exécution dans le serveur de développement django, mais le même code ne fonctionne pas sur le serveur apache. – Suhail

Répondre

3

Je suppose que vous utilisez les capacités de CGI d'Apache. Cela signifie qu'à chaque requête le script est recommencé. Ce qui signifie que la variable globale est initialisée avec chaque appel. En dehors de cela, il n'est pas vraiment judicieux d'utiliser des globals pour stocker ce qui est essentiellement une donnée de session (avec une session, et donc un état, par utilisateur). Les globals sont pour tous les utilisateurs les mêmes, et les sessions sont par utilisateur, ce qui est ce que vous (voulez).

Dans votre cas, les données de cette session doivent probablement être stockées dans une base de données, car l'interpréteur python se terminera lorsque votre script sera terminé et qu'une seule page sera affichée.

+0

oui ce que vous dites est correct, mais j'ai essayé d'utiliser ceci en utilisant les sessions, j'ai essayé d'utiliser request.POST.next et request.POST ['next'], request.GET.net et request.GET ['next'] , mais les choses ne fonctionnaient toujours pas car elles venaient à vide. En fait, ce que j'essaye de faire est, si la session de n'importe quel utilisateur est expirée ou il n'est pas identifié, et essaye toujours d'accéder à l'URL interne, il devrait être redirigé vers cette URL, après qu'il s'est connecté J'ai donc pensé à utiliser les variables globales. – Suhail

+1

Vous devez stocker l'URL dans 'request.session.red'. 'request' est aussi un objet de courte durée (une requête: browser -> server). –

+0

Salut Aaron, pouvez-vous expliquer un peu plus, j'ai essayé, mais maintenant je reçois un message d'erreur, objet 'SessionStore' n'a aucun attribut 'rouge' – Suhail

0

Comme on vous l'a déjà dit, l'utilisation d'objets globaux est une recette pour un désastre dans un environnement multi-processus comme un site Apache en direct. Vous aurez plusieurs utilisateurs accédant tous aux variables des autres, et cela ne fonctionnera jamais comme vous le souhaitez.

extraneon a raison de dire que vous devriez utiliser des sessions pour cela - c'est pour cela qu'elles sont. De votre commentaire à sa réponse, il est évident que vous n'avez pas lu le sessions documentation - vous devriez le faire maintenant.

+0

Hey Daniel, merci pour la suggestion, le problème est résolu. – Suhail

0

Hé les gars merci pour l'aide, oui je sais utiliser des variables globales est une mauvaise façon de le faire, mais je n'a pas pu le faire fonctionner, mais maintenant son travail, voici le code ci-dessous:

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) 
Questions connexes