2016-03-02 5 views
-2

сталкивается функция неопределенной ошибки, когда я запускаю сервер (Flask приложение):функция Python не определена

NameError: имя «format_date» не определен enter image description here

Это все мой код до сих пор:

from flask import Flask, render_template 
import markdown 
import os 
from werkzeug import cached_property 
import yaml 

POSTS_FILE_EXTENSION = '.md' 
app = Flask(__name__) 

class Post(object): 
    def __init__(self,path): 
     self.path=path 
     self._initialize_metadata() 

    @cached_property 
    def html(self): 
     with open(self.path, 'r') as fin: 
      content= fin.read().split('\n\n',1)[1].strip() 
     return markdown.markdown(content) 

    def _initialize_metadata(self): 
     content = '' 
     with open(self.path, 'r') as fin: 
      for line in fin: 
       if not line.strip(): 
        break 
       content +=line 
     self.__dict__.update(yaml.load(content)) 

    def format_date(value, format='%B %d, %Y'): 
     return value.strftime(format) 

@app.route('/') 
def index(): 
    return 'Hello, world!' 

@app.route('/blog/<path:path>') 
def post(path): 
    #import ipdb; ipdb.set_trace() 
    path = os.path.join('posts', path+'.md') 
    post = Post(path) 
    return render_template('post.html', post=post, format_date=format_date) 


if __name__ == '__main__': 
    app.run(port=8000, debug=True) 

Почему это не определено? Я определил его. : |

post.html:

<h3 id='date'>{{format_date(post.date)}}</h3> 

hello.md:

title: Hello, worldtitle! 
date: 2013-03-25 

# Hello WOrld 

### This is an H3 level header 

P.S. : Не судите меня, я ноб.

+0

Вы импортировали его? –

+0

Что нужно импортировать? – Katallone

+0

Вам не хватает фактического stacktrace, который, вероятно, находится в строке 'render_template', потому что у вас есть функция, определенная в другом файле, а не в той, которая содержит вашу функцию' post' –

ответ

2

Вы пытаетесь использовать функцию format_date, определенную в классе. Вы можете определить его как отдельную функцию или просто использовать метод в классе Post. Вы должны были бы изменить его немного

class Post(object): 
    def __init__(self,path): 
     ... 

    def format_date(self, format='%B %d, %Y'): 
     return self.date.strftime(format) 

И в оказании шаблона:

return render_template('post.html', post=post) 

Тогда вам не нужно будет проходить в имени функции, и вместо того, чтобы просто позвонить

<h3 id='date'>{{post.format_date()}}</h3> 

Однако предполагается, что у вас есть свойство date, определенное на вашем классе где-нибудь (которое в вашем существующем шаблоне предполагается, что вы это делаете, но я его нигде не вижу).