【问题标题】:python global variable not working in apachepython全局变量在apache中不起作用
【发布时间】:2010-06-14 08:08:36
【问题描述】:

我遇到了全局变量的问题,当我在 django 开发服务器中运行时它工作正常,但在 apache 中它不起作用

下面是代码:

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)

此代码在 django 开发服务器中运行良好,但在 apache 中,url 被重定向到 '/project3/recipes'

【问题讨论】:

  • 如果你查看函数,全局变量“red”的值是在用户会话过期或未登录但尝试访问内部 URL 后设置的,所以我得到了正确的全局变量 red 的值,即用户在 django 开发服务器中运行时试图在没有登录的情况下访问的 url,但相同的代码在 apache 服务器上不起作用。

标签: python django apache global-variables


【解决方案1】:

我猜您使用的是 Apache 的 CGI 功能。这意味着每次请求都会重新启动脚本。这意味着每次调用都会初始化全局变量。

除此之外,使用全局变量来存储本质上是会话数据的内容并不是一个好主意(每个用户都有会话,因此也有状态)。全局变量对所有用户都是一样的,会话是每个用户的,这是你(应该)想要的。

在您的情况下,会话的数据可能应该存储在某个数据库中,因为当您的脚本完成并呈现单个页面时,python 解释器将结束。

【讨论】:

  • 是的,你说的是正确的,但我尝试使用会话,我尝试使用 request.POST.next 和 request.POST['next'],request.GET.net 和 request .GET['next'],但仍然没有工作,因为这些都是空的。实际上,我想要做的是,如果任何用户的会话已过期或他没有登录,并且仍在尝试访问任何内部 url,他应该在他登录后被重定向到该 url。因此我想到了使用全局变量。
  • 您必须将 url 存储在 request.session.red 中。 request 也是一个短暂的对象(一个请求:浏览器 -> 服务器)。
  • 嗨 Aaron,你能再解释一下吗,我试过了,但现在我收到一条错误消息,“SessionStore”对象没有属性“red”
  • 嘿亚伦,谢谢伙计,它现在可以工作了。我明白了,我将它存储在 request.session['red'] 中并访问了它。感谢您的帮助。
【解决方案2】:

正如您之前被告知的,在实时 Apache 站点等多进程环境中,使用全局对象会导致灾难。您将有多个用户都访问彼此的变量,这永远不会按您的意愿工作。

extraneon 是正确的,您应该为此使用会话 - 这就是它们的用途。从您的评论到他的回答,很明显您还没有阅读sessions documentation - 您现在应该阅读。

【讨论】:

  • 你好丹尼尔,感谢您的建议,问题已解决。
【解决方案3】:

大家好,感谢您的帮助,是的,我知道使用全局变量是一种不正确的做法,但我无法让它工作,但现在它工作了,下面是代码:

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)

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 2013-07-13
    • 2017-05-20
    • 2013-09-21
    • 1970-01-01
    相关资源
    最近更新 更多