2013-04-17 29 views
6

Tôi không hiểu làm thế nào để thay đổi một biến toàn cầu khi sử dụng tập bình flask mở rộng bình. Để chứng minh vấn đề của tôi, tôi đã phát triển ứng dụng bình nhỏ sau đây, điều này sẽ làm tăng biến đếm toàn cầu cho mỗi cuộc gọi yêu cầu. Ngoài ra nó còn cung cấp một chức năng thiết lập lại để thiết lập lại các truy cập toàn cầu:Thay đổi biến toàn cầu từ bên ngoài trong ứng dụng web Python dựa trên Flask

# -*- coding: utf-8 -*- 

import sys 
reload(sys) 
sys.setdefaultencoding("utf-8") 

from flask import Flask 
from flask.ext.script import Manager 
app = Flask(__name__) 
app.debug = True 

manager = Manager(app) 

counter = 0 

@manager.command 
@app.route("/reset") 
def reset(): 
    global counter 
    print "Counter before reset:", counter 
    counter = 0 
    print "Counter after reset:", counter 
    return str(counter) 

@app.route("/") 
def add(): 
    global counter 
    print "Counter before adding:", counter 
    counter +=1 
    print "Counter after adding:", counter 
    return str(counter) 

if __name__ == "__main__": 
    manager.run()  

tôi bắt đầu ứng dụng bình của tôi sử dụng python counter.py runserver

Khi tôi truy cập vào địa chỉ 127.0.0.1:5000 tôi thấy bộ đếm tăng

Counter before adding: 0 
Counter after adding: 1 
127.0.0.1 - - [17/Apr/2013 10:09:35] "GET/HTTP/1.1" 200 - 
127.0.0.1 - - [17/Apr/2013 10:09:35] "GET /favicon.ico HTTP/1.1" 404 - 
Counter before adding: 1 
Counter after adding: 2 
... 

Khi tôi truy cập vào địa chỉ 127.0.0.1answer000/reset Tôi thấy rằng bộ đếm được đặt lại

Counter before reset: 4 
Counter after reset: 0 
127.0.0.1 - - [17/Apr/2013 10:10:39] "GET /reset HTTP/1.1" 200 - 
127.0.0.1 - - [17/Apr/2013 10:10:39] "GET /favicon.ico HTTP/1.1" 404 - 

Tuy nhiên khi tôi cố gắng gọi phương thức thiết lập lại từ dòng lệnh bằng cách sử dụng giao diện quản lý được cung cấp bởi phần mở rộng bình-kịch bản biến truy cập toàn cầu không được đặt lại:

> python counter.py reset 
Counter before reset: 0 
Counter after reset: 0 
0 

Tôi đang làm gì sai? Làm thế nào tôi có thể truy cập và thao tác một biến toàn cầu bằng cách sử dụng bình-script?

Trả lời

7

Biến toàn cục của Python như counter sống trong không gian bộ nhớ của hệ điều hành. Mỗi quá trình bắt đầu và dừng lại (ứng dụng, lệnh, v.v.) đều có bộ nhớ riêng.

Khi bạn chạy python counter.py reset, nó bắt đầu một quy trình mới với không gian bộ nhớ và biến riêng của nó. Các thiết lập lại biến được chạy với quá trình này, không phải là quá trình chạy máy chủ web.

Để thiết lập lại một cách chính xác các biến

  • Giữ biến ra khỏi không gian bộ nhớ quá trình (Ví dụ trong memcached, cơ sở dữ liệu)

  • Tạo một lệnh mà gọi là quá trình máy chủ web thông qua một URL xem đặc biệt sử dụng wget, curl, urllib hoặc như vậy và chế độ xem này đặt lại biến trong không gian bộ nhớ quá trình

+0

Vì vậy, không có cách nào dễ dàng (không có DB, memcache) để sửa ví dụ của tôi? – asmaier

+0

Không, thật không may đó là cách máy tính hoạt động –

Các vấn đề liên quan