2017-10-04 6 views
0

J'essaie de créer une application Web avec Tornado et j'aimerais ajouter certaines des fonctionnalités de style du paquetage Python Deform. Ci-dessous, j'essaie de mettre en œuvre un formulaire de connexion utilisateur en combinant Tornado et Deform. Cependant, une erreur est en train d'être soulevée: TypeError: __init__() takes exactly 2 arguments (3 given).Implémentation de la déformation avec tornade

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) 

Mon principal problème est que je suis incapable de combiner la méthode Tornado get et servir les modèles déforment. Est-ce que quelqu'un peut-il me montrer la bonne direction? S'il vous plaît laissez-moi savoir de toutes les questions que vous avez.

Edit:

Voici la pleine retraçage:

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

Pouvez-vous partager un retraçage? Cela révèlera quelle ligne passe le mauvais nombre d'arguments à la méthode \ _ \ _ init \ _ \ _ d'une classe. –

+0

@ A.JesseJiryuDavis s'il vous plaît voir ma récente édition. – Ajax1234

+0

Le retraçage est trop vague. Mais si je dois deviner, je dirais que comme vous avez décoré le gestionnaire 'StudentRegister' avec' @ view_defaults', ce décorateur passe un argument supplémentaire à 'StudentRegister', mais comme vous pouvez le voir, c'est' __init__' prend seulement deux arguments. Je pense que vous devriez essayer de le changer à quelque chose comme '__init __ (self, request, * args)' et voir si cela fonctionne. – xyres

Répondre

1

Si vous substituez __init__, assurez-vous de faire correspondre la signature de la superclasse (et appelez super().__init__(*args, **kw)). Dans ce cas, RequestHandler.__init__() prend deux arguments, les objets application et request. Ou si vous préférez ne pas penser à faire correspondre la signature __init__ de la superclasse (que vous ne devriez pas savoir/attention puisque ces objets sont construits par le framework), vous pouvez remplacer initialize() à la place (cette méthode est fournie par RequestHandler spécifiquement vous n'avez pas à vous soucier des subtilités de la correction __init__())

+0

Merci beaucoup pour votre réponse. J'ai essayé votre solution ci-dessus, et il semble qu'elle ait corrigé le 'TypeError'; cependant, j'obtiens maintenant un message d'erreur qui est lié au rendu de modèle: 'ValueError: Aucune telle usine de rendu .pt'. Avez-vous des suggestions sur la façon dont cela pourrait être corrigé? ' – Ajax1234

+0

Qu'est-ce que' get_renderer'? Il n'y a aucune importation pour cela dans votre échantillon. Je ne suis pas familier avec quel paquet fournit cette fonction. –