2017-10-04 8 views
0

토네이도가있는 웹 응용 프로그램을 만들려고하고 있으며 Python 패키지 변형의 일부 스타일링 기능을 추가하고 싶습니다. 아래, 나는 토네이도와 변형 모두를 빗질하여 사용자 로그인 양식을 구현하려고합니다. 그러나 오류가 발생합니다 : TypeError: __init__() takes exactly 2 arguments (3 given).토네이도로 변형 구현

class demonstrate(object): 
    def __init__(self, title): 
     self.title = title 

    def __call__(self, method): 
     method.demo = self.title 
     return method 
class MainHandler(tornado.web.RequestHandler): 
    def get(self): 

    self.render('/Users/jamespetullo/Downloads/studenthost-master/studentscout/home.html') 
@view_defaults(route_name='student_register') 
class StudentRegster(tornado.web.RequestHandler): 
    def __init__(self, request): 
     self.request = request 
     self.macros = get_renderer('templates/main.pt').implementation().macros 
    def render_form(self, form, appstruct=colander.null, submitted='submit', 
       success=None, readonly=False, is_i18n=False): 

     captured = None 

     if submitted in self.request.POST: 

      try: 
       controls = self.request.POST.items() 
       captured = form.validate(controls) 
       if success: 
        response = success() 
        if response is not None: 
         return response 
       html = form.render(captured) 
      except deform.ValidationFailure as e: 
          html = e.render() 

     else: 
      html = form.render(appstruct, readonly=readonly) 

     if self.request.is_xhr: 
      return Response(html) 

     code, start, end = self.get_code(2) 
     locale_name = get_locale_name(self.request) 

     reqts = form.get_widget_resources() 

     printer = pprint.PrettyPrinter(width=1) 
     printer.format = my_safe_repr 
     output = printer.pformat(captured) 
     captured = highlight(output, 
         PythonLexer(), 
         formatter) 

    # values passed to template for rendering 
     return { 
     'form':html, 
     'captured': captured, 
     'code': code, 
     'start':start, 
     'end':end, 
     'is_i18n':is_i18n, 
     'locale': locale_name, 
     'demos':self.get_demos(), 
     'title':self.get_title(), 
     'css_links':reqts['css'], 
     'js_links':reqts['js'], 
     } 
    @view_config(renderer='templates/form.pt', name='edit') 
    @demonstrate('Edit Form') 
    def get(self): 


     import datetime 

     class Mapping(colander.Schema): 
      name = colander.SchemaNode(
      colander.String(), 
      description='Content name') 
      date = colander.SchemaNode(
      colander.Date(), 
      widget=deform.widget.DatePartsWidget(), 
      description='Content date') 

     class Schema(colander.Schema): 
      number = colander.SchemaNode(
      colander.Integer()) 
      mapping = Mapping() 

     schema = Schema() 
     form = deform.Form(schema, buttons=('submit',)) 
     appstruct = { 
     'number': 42, 
     'mapping': { 
      'date': datetime.date(2010, 4, 9), 
      } 
     } 

     return self.render_form(form, appstruct=appstruct) 

내 주요 문제는 내가 토네이도 get 방법을 결합하고 변형합니다 템플릿을 제공 할 수없는 생각이다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까? 당신이 가지고있는 질문이 있으면 알려주세요. 당신이 __init__를 오버라이드 (override) 슈퍼 클래스의 서명과 일치해야합니다 (그리고 super().__init__(*args, **kw)를 호출 할) 경우

ERROR:tornado.application:Uncaught exception 
Traceback (most recent call last): 
File "/Library/Python/2.7/site-packages/tornado/http1connection.py", line 238, in _read_message 
delegate.finish() 
File "/Library/Python/2.7/site-packages/tornado/routing.py", line 251, in finish 
self.delegate.finish() 
File "/Library/Python/2.7/site-packages/tornado/web.py", line 2096, in finish 
self.execute() 
File "/Library/Python/2.7/site-packages/tornado/web.py", line 2116, in execute 
**self.handler_kwargs) 
TypeError: __init__() takes exactly 2 arguments (3 given) 
+0

추적을 공유 할 수 있습니까? 클래스의 \ _ \ _ init \ _ \ _ 메소드에 잘못된 수의 인수를 전달하는 행이 표시됩니다. –

+0

@ A.JesseJiryuDavis 제 최근 편집을 참조하십시오. – Ajax1234

+0

추적이 너무 막연합니다. 하지만 추측해야만한다면,'@ view_defaults'로'StudentRegister' 핸들러를 꾸미면이 데코레이터는'StudentRegister'에 추가 인수를 전달하고 있습니다 만, 보시다시피,'__init__'입니다. 두 가지 주장 만 취합니다. 나는 당신이'__init __ (self, request, * args)'와 같은 것으로 그것을 변경하려고 노력해야한다고 생각하고 그것이 작동하는지 확인해야한다. – xyres

답변

1

:

편집 : 여기

전체 역 추적입니다. 이 경우 RequestHandler.__init__()은 두 개의 인수 인 응용 프로그램과 요청 객체를 사용합니다. 또는 수퍼 클래스의 __init__ 서명 (이 객체가 프레임 워크에 의해 생성 된 이후에 실제로는 알 수 없거나 신경 쓰지 않아야 함)을 일치시키지 않으려면 대신 initialize()을 무시할 수 있습니다 (이 방법은 RequestHandler에 의해 구체적으로 제공됩니다). __init__()을 무시하는 미묘함에 대해 걱정할 필요가 없습니다.

+0

답변 해 주셔서 대단히 감사드립니다. 위의 해결책을 시도하고 그것은'TypeError' 고정되어 나타납니다; 그러나 이제 템플릿 렌더링과 관련된 오류 메시지가 나타납니다. 'ValueError : No such renderer factory .pt'. 이것이 어떻게 수정 될 수 있는지에 대한 제안이 있습니까? ' – Ajax1234

+0

무엇이'get_renderer'입니까? 샘플에는 가져 오기가 없습니다. 나는이 패키지를 제공하는 패키지에 익숙하지 않다. –