2017-11-02 14 views
0

브라우저에서 내 페이지를 볼 때 다음 오류가 발생합니다.python flask의 전역 변수는 사용하기 전에 5 개의 함수 중 하나를 사용하기 전에 참조되고 있다고 주장합니다

File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1997, in __call__ 
    return self.wsgi_app(environ, start_response) 
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1985, in wsgi_app 
    response = self.handle_exception(e) 
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1540, in handle_exception 
    reraise(exc_type, exc_value, tb) 
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1982, in wsgi_app 
    response = self.full_dispatch_request() 
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1614, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1517, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1612, in full_dispatch_request 
    rv = self.dispatch_request() 
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1598, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask_login/utils.py", line 228, in decorated_view 
    return func(*args, **kwargs) 
File "/home/jsnyder10/Documents/jMessage/app/views.py", line 66, in admin_edit_groups 
    if not g.user.admin: 
UnboundLocalError: local variable 'g' referenced before assignment 

여기는 내 파이썬 코드가 라우팅을 위해 플라스크를 사용하고 있습니다. 첫 번째 기능은 완벽하게 작동하는 모든 단일 관리 경로에서 사용한 코드이지만 admin_edit_groups 경로에서이 오류가 발생합니다. 무엇이 없습니까?

from flask import render_template, flash, redirect, session, url_for, request, \ 
    g, jsonify, send_from_directory 

@app.route('/admin', methods=['GET', 'POST']) 
@login_required 
def admin(): 
    if not g.user.admin: 
     flash('Page unacessible.') 
     return redirect(url_for('index')) 
    return render_template('admin.html',title='Admin') 

@app.route('/admin_edit_groups', methods=['GET', 'POST']) 
@login_required 
def admin_edit_groups(): 
    if not g.user.admin: 
     flash('Page unacessible.') 
     return redirect(url_for('index')) 
    form = AddGroupForm() 
    if request.method == 'POST' and form.validate(): 
     if not Group.query.filter_by(name=form.groupname.data).count()>0: 
      g=Group(name=form.groupname.data) 
      db.session.add(g) 
      db.session.commit() 
      flash('Added Group name ' + form.groupname.data) 
     else: 
      flash('Group: ' + form.groupname.data + ' already exists.') 
    groups=Group.query.all() 
    return render_template('admin_edit_groups.html',title='Admin', form=form, groups=groups) 

답변

2

당신은 당신의 함수 내에서 다른 g를 사용하고,이 g 세계를 덮어 쓰게됩니다.

+0

위의 코드에서 위의 코드가 나타나면 전역 변수를 사용하지 않는 이유는 무엇입니까? 위의 코드는 실행되지 않고 변수가 다시 할당됩니까? – 0TTT0

+0

@ 0TTT0 만약 당신이 말한대로 작동한다면, 그것은 훨씬 모호해질 것입니다. 글로벌 코드인지 로컬 코드인지 확인하려면 코드를 신중하게 검토해야합니다. 당신이 큰 기능을 가지고 있다면 이것은 재앙이 될 것입니다. – Sraw

+0

파싱이 실제로 어떻게 작동하는지 설명 할 수 있습니까? – 0TTT0