2014-07-10 2 views
0

나는 내 플라스크 응용 프로그램에서 여러 가지 견해를 가지고 있습니다. 각보기에는 고유 한 하위보기가 있으며, 지속적으로 각 하위보기에는 작은 템플리트가 있습니다. 시각적 데모 및 URL 구조는 다음과 같습니다.플라스크의 동적 render_template()

|-settings ___________ [@app.route(/manage)] 
|--menu_settings _____ [@app.route(/manage?current=menu_settings)] 
|--main_settings _____ [@app.route(/manage?current=main_settings)] 
|--additional_settings [@app.route(/manage?current=additional_settings)] 

|-online_store [@app.route(/online_store)] 
|--delivery __ [@app.route(/online_store?current=delivery)] 
|--payment ___ [@app.route(/online_store?current=payment)] 
|--store _____ [@app.route(/online_store?current=store)] 

if 또는 if 조건을 사용하면됩니다. 예 :

@admin.route('/manage', methods = ['GET', 'POST']) 
@login_required 
def manage(current = ''): 

    current = request.args.get('current') 

    if current == 'menu_settings': 
     return render_template('admin/manage/site_figuration.html', 
      title = 'Site figuration', 
      current = current) 
    elif current == 'internet_market': 
     return render_template('admin/manage/internet_market.html', 
     title = 'Internet market', 
     current = current) 
    else: 
     return '404 - Template not found' 

제 질문은 제가 올바르게하고있는 것입니까? 또는이 문제를 극복하기위한 또 다른 쉬운 방법이 있습니까? 이 방법을 사용하는 것이 합리적입니까, 아니면 JQuery load() 메서드를 사용해야합니까?

답변

3

너무 복잡한 것처럼 보입니다. 방법 :

@admin.route('/manage') 
@admin.route('/manage/<current>') 
@login_required 
def manage(current = None): 
    if current == 'menu_settings': 
     template = 'admin/manage/site_configuration.html' 
     title = 'Site configuration' 
    elif current == 'internet_market': 
     template = 'admin/manage/internet_market.html' 
     title = 'Internet market' 
    elif current is None: 
     template = 'admin/manage/default.html' 
     title = 'Default page for manage' 
    else: 
     flask.abort(404) 

    return render_template(template, title=title, current=current) 

그러나 더 정확한 접근 방식으로 여러 경로가있는 것도 알 수 있습니다. 왜 바퀴를 재발견합니까?

@admin.route('/manage') 
@login_required 
def manage(): 
    return render_template('admin/manage/default.html', 
          title='Default page for manage', 
          current=None) 

@admin.route('/manage/menu_settings') 
@login_required 
def manage_menu_settings(): 
    return render_template('admin/manage/site_configuration.html', 
          title='Site configuration', 
          current='menu_settings') 

@admin.route('/manage/internet_market') 
@login_required 
def manage_internet_market(): 
    return render_template('admin/manage/internet_market.html', 
          title='Internet market', 
          current='internet_market') 

주의 :이 코드는 테스트되지 않았으므로 버그 및/또는 오타가 있음에 유의하십시오.

+0

Mr. Andrejs. 다른 사람들에 대해 잘 모릅니다. 그러나 저는 주로 당신의 엘프를 좋아합니다. 앞서 언급 한 것처럼 views.py를 조금 깨끗하게 유지하고 싶습니다.50 개 이상의 뷰가 있기 때문에 furete 편집을하기가 정말 어려울 것입니다. – Max

+0

당신의 views.py를 여러 파일로 분리 할 수 ​​있습니다. 내가 일반적으로 사용하는 방법은 views/__ init__.py, views/admin.py, views/general.py, views/api.py 등을 갖는 것이다. views/__ init__.py는 다른 파일들을 임포트한다. 이것은 당신을 위해 물건을 깨끗하게 유지하는 데 도움이됩니까? – Daniel

2

아니요, 그렇다고 생각하지 않습니다.

왜 여러 개의보기를 만들지 않으십니까?

@admin.route('/manage/menu', methods = ['GET', 'POST']) 
@login_required 
def manage_menu(): 
    return render_template('admin/manage/site_figuration.html', 
      title = 'Site figuration', 
      current = request.args.get('current')) 

@admin.route('/manage/internet_market', methods = ['GET', 'POST']) 
@login_required 
def manage_market(): 
    return render_template('admin/manage/internet_market.html', 
     title = 'Internet market', 
     current = request.args.get('current')) 

이 방법은 확장 성이 뛰어나고 유지 관리가 용이합니다.

정말로 원한다면이 모든 것을 데코레이터 또는 클래스 기반 뷰 (플라스크가 지원하는 경우)로 감쌀 수 있습니다.

편집

내가 주로 피라미드보다는 플라스크에서 작동 (그리고 비슷하지만 전반적으로 더 강력한 그대로 정직하게 당신이 전환 고려하는 것이 좋습니다).

피라미드에서는 이와 비슷한 모양의 클래스 기반보기를 사용합니다. 당신이 매개 변수

# Now the request.params dict will have a key of 'product' 
# with whatever that path segment is. 
config.add_route('product_view','/products/{product}') 

당신은 쉽게

에 링크를 생성 할 수 있습니다를 사용하여 시작할 때 정말 강력한 얻을

config.add_route('manage_menu', '/manage/menu') 
config.add_route('internet_market', '/manage/market') 

입니다 :

@view_defaults(permission='admin') 
class admin_views: 
    def __init__(self, request): 
    self.request = request 
    # Assign anything else you want to precalculate 
    # for all views to a self variable 

    @view("manage_menu", renderer='manage_menu.jinja2') 
    def menu(self): 
    return {'title':'Manage Menu'} #These are your template variables 

    @view("internet_market", renderer='internet_market.jinja2') 
    def market(self): 
    return {'title': 'Internet Market"} 

다음 경로 설정이 같은 일이 될 것입니다

route_path('view_name', request_obj, #any variables here) 

# That'll generate a proper link. 
# If the client is using SSL it'll be an https link, etc. 
route_path('product_view', self.request, product=5). 
+0

답변 해 주셔서 감사합니다. 내가 멀티 뷰를 사용하고 싶지 않은 이유는 어떻게 든 뷰를 파괴하고 뷰를 유지하려고하기 때문입니다. 50 개 이상의 조회수가 있고 더 많은 하위보기가 있기 때문에. 데코레이터 사용법을 칭찬 해 주시겠습니까? – Max

+0

몇 초에서 바로 편집 할 수 있습니다. –

관련 문제