2011-08-16 38 views
19

Tôi có một câu hỏi liên quan đến bản thiết kế. Tôi có một ứng dụng mà được cấu trúc như thế nàyBản thiết kế chi tiết sử dụng thích hợp

app 
    /run.py 
    /APP 
     /__init__.py 
     /VIEWS 
      /__init__.py 
      /general.py 
      /crud.py 

này là mã http://pastebin.com/bsHsTGAP

run.py

from overwatch import app 
app.run() 

__init__.py

from flask import Flask, session, g, render_template, request, redirect, url_for, Response 
import websiteconfig as config 
from flaskext.principal import Identity, Principal, RoleNeed, UserNeed, \ 
      Permission, identity_changed, identity_loaded 

app = Flask(__name__) 
app.debug = config.DEBUG 
app.secret_key = config.SECRET_KEY 


principals = Principal(app) 
principals._init_app(app) 
@app.errorhandler(404) 
def not_found(error): 
    return render_template('404.html'), 404 

@app.errorhandler(403) 
def page_not_found(e): 
    session['redirected_from'] = request.url 
    return redirect(url_for('crud.login')) 

# handle login failed 
@app.errorhandler(401) 
def page_not_found(e): 
    return Response('<p>Login failed</p>') 

from overwatch.views import general 
from overwatch.views import crud 


app.register_blueprint(general.mod) 
app.register_blueprint(crud.mod) 

general.py

from flask import Blueprint, render_template, session, redirect, url_for, \ 
    request, flash, g, Response, jsonify 
from flaskext.principal import Identity, Principal, RoleNeed, UserNeed, \ 
      Permission, identity_changed, identity_loaded 
from .. import principals 

mod = Blueprint('general', __name__) 

normal_role = RoleNeed('normal') 
normal_permission = Permission(normal_role) 

@mod.route('/') 
@normal_permission.require(http_exception=403) 
def index(): 
    return "YOU'RE IN" 

crud.py

from flask import Blueprint, render_template, session, redirect, url_for, \ 
    request, flash, g, Response, jsonify, abort, Response 
from mongokit import Connection, Document 
from db import user_exists, email_exists, return_attribute, check_credentials 
from forms import RegistrationForm, LoginForm 
from .. import app 
from flaskext.principal import Identity, Principal, RoleNeed, UserNeed, \ 
      Permission, identity_changed, identity_loaded 
from general import normal_role, normal_permission 

mod = Blueprint('crud', __name__) 

@mod.route('/login/', methods=['GET', 'POST']) 
def login(): 
    form = LoginForm(request.form) 
    error = None 
    if request.method == 'POST' and form.validate(): 
     if check_credentials(form.username.data,form.password.data): 
      identity = Identity(form.username.data) 
      identity_changed.send(app, identity=identity) 
      return redirect(session['redirected_from']) 
     else: 
      return abort(401) 
    return render_template('login.html', form=form, error=error) 

@app.route("/logout/") 
def logout(): 
    for key in ['identity.name', 'identity.auth_type', 'redirected_from']: 
     try: 
      del session[key] 
     except: 
      pass 
    return Response('<p>Logged out</p>') 

@identity_loaded.connect_via(app) 
def on_identity_loaded(sender, identity): 
    identity.provides.add(normal_role) 

Thing là, tôi dường như được nhập khẩu rất nhiều thứ vào rất nhiều thứ. Ngay bây giờ nó hoạt động. nếu tôi đi đến trang chỉ mục, được xử lý bởi general.py blueprint và được bảo mật với normal_permission nó chuyển hướng đến/đăng nhập được xử lý bởi crud.py kế hoạch chi tiết và nếu đăng nhập chuyển hướng đến chỉ mục. Một lần nữa, ngay bây giờ nó ... hoạt động nhưng .. nó cũng cảm thấy thực sự dll bẩn và ô uế và .. bleac ... vì vậy không giống như một số mã tốt tôi đọc :)

Bất kỳ đề nghị được chào đón xin vui lòng. Nếu đây không phải là cách để giải quyết nó, tôi sẵn sàng học hỏi. Tôi không muốn có một số mã mà .. chỉ hoạt động.

Cảm ơn bạn đã dành thời gian đọc và có thể trả lời.

ps. nếu tôi dán quá nhiều mã ở đây hãy cho tôi biết và tôi sẽ chỉnh sửa nó.

+0

có vẻ như rất nhiều thứ bạn nhập không được sử dụng, tại sao bạn không nhập vào từng mô-đun chỉ những gì bạn định sử dụng? (dù sao, nhập khẩu những thứ tương tự ở nhiều nơi không phải là vấn đề hiệu suất, vì nhập khẩu chỉ xảy ra một lần, nhưng nhập khẩu không sử dụng làm cho mã của bạn ít có thể đọc được) – MatToufoutu

+0

Tôi nghĩ rằng bạn đang cố gắng hết sức. Coy và dán công việc. Hqvent đã làm sạch mọi thứ. Tôi đã được nhiều hơn về cách tôi cần phải từ .. Nhập khẩu ứng dụng trong crud.py để cập nhật danh tính thông qua identity_changed và nhiều hơn nữa dọc theo những dòng – pocorschi

+3

Cách chính xác để truy cập các ứng dụng hiện tại từ trong một lần xem trong mô-đun khác là thông qua Đối tượng 'flask.current_app', là một proxy cho ứng dụng hiện tại. (Nếu đây là những gì bạn đang tìm kiếm, hãy cho tôi biết và tôi sẽ thêm nhận xét làm câu trả lời) – MatToufoutu

Trả lời

19

Để truy cập ứng dụng hiện tại từ chế độ xem kế hoạch chi tiết của bạn, bạn nên sử dụng đối tượng flask.current_app, nó là proxy cho ứng dụng hiện tại (và nó được sử dụng trong phần mở rộng của bình).

Về mã của bạn, ngoại trừ hàng nhập khẩu chưa sử dụng, nó được tổ chức tốt theo ý kiến ​​của tôi, nhưng tôi không thể nói về phần principal, vì tôi chưa bao giờ sử dụng nó.

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