全局变量和 python 烧瓶
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19182963/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Global variable and python flask
提问by user2592038
What i want to do is just display the firstevent from one API. The variable is called “firstevent” and the value should display on the webpage. But firstevent is inside a def, so i change it into a global variable and hope it can be used across different functions. But it shows “NameError: global name 'firstevent' is not defined”. This is what I am doing:
我想要做的只是显示来自一个 API 的第一个事件。该变量称为“firstevent”,该值应显示在网页上。但是 firstevent 在 def 中,所以我将其更改为全局变量并希望它可以在不同的函数中使用。但它显示“NameError: global name 'firstevent' is not defined”。这就是我正在做的:
define a global variable
定义一个全局变量
global firstevent
send this variable a random value, it supposed to be events['items'][1]['end']
向这个变量发送一个随机值,它应该是 events['items'][1]['end']
firstevent = 1
displaying firstevent's value on website.
在网站上显示 firstevent 的值。
@app.route("/")
def index():
return 'User %s' % firstevent
I am not sure what's happening now, maybe it's a scope issue? I have check many answers online but still cannot find the solution.
我不确定现在发生了什么,也许是范围问题?我在网上查了很多答案,但仍然找不到解决方案。
Here are the details(not the whole code)
这是详细信息(不是整个代码)
import os
# Retrieve Flask, our framework
# request module gives access to incoming request data
import argparse
import httplib2
import os
import sys
import json
from flask import Flask, request
from apiclient import discovery
from oauth2client import file
from oauth2client import client
from oauth2client import tools
from apiclient.discovery import build
from oauth2client.client import OAuth2WebServerFlow
import httplib2
global firstevent
app = Flask(__name__)
def main(argv):
# Parse the command-line flags.
flags = parser.parse_args(argv[1:])
# If the credentials don't exist or are invalid run through the native client
# flow. The Storage object will ensure that if successful the good
# credentials will get written back to the file.
storage = file.Storage('sample.dat')
credentials = storage.get()
if credentials is None or credentials.invalid:
credentials = tools.run_flow(FLOW, storage, flags)
# Create an httplib2.Http object to handle our HTTP requests and authorize it
# with our good Credentials.
http = httplib2.Http()
http = credentials.authorize(http)
# Construct the service object for the interacting with the Calendar API.
calendar = discovery.build('calendar', 'v3', http=http)
created_event = calendar.events().quickAdd(calendarId='[email protected]', text='Appointment at Somewhere on June 3rd 10am-10:25am').execute()
events = calendar.events().list(calendarId='[email protected]').execute()
#firstevent = events['items'][1]['end']
firstevent = 1
#print events['items'][1]['end']
# Main Page Route
@app.route("/")
def index():
return 'User %s' % firstevent
# Second Page Route
@app.route("/page2")
def page2():
return """<html><body>
<h2>Welcome to page 2</h2>
<p>This is just amazing!</p>
</body></html>"""
# start the webserver
if __name__ == "__main__":
app.debug = True
app.run()
回答by aIKid
Yep, it's a scope problem. In the beginning of your main()
function, add this:
是的,这是一个范围问题。在main()
函数的开头,添加以下内容:
global firstevent
That should done it. Any variable that is not defined inside a function, is a global. You can access it straightly from any function. However, to modify the variable you'll need to write global var
in your function.
那应该做到了。任何未在函数内部定义的变量都是全局变量。您可以直接从任何功能访问它。但是,要修改变量,您需要global var
在函数中写入。
Example
例子
This creates a local variable "firstevent" on the function:
这会在函数上创建一个局部变量“firstevent”:
firstevent = 0
def modify():
firstevent = 1
And this modifies the global variable 'firstevent'
这会修改全局变量“firstevent”
firstevent = 0
def modify():
global firstevent
firstevent = 1