【问题标题】:404 error while using flask_restful. Need to return the output as a rest api response使用 flask_restful 时出现 404 错误。需要将输出作为 rest api 响应返回
【发布时间】:2019-07-02 22:44:29
【问题描述】:

我有一个代码,它在 python 中执行 ocr 或将 pdf 转换为 txt,并使用基于正则表达式的方法来找出文档的类别。我希望我的代码作为 api 公开。我正在使用烧瓶来完成这项任务。运行 url 时出现 404 Not Found 错误。

我的文档类别提取代码如下:文件名是 dtd.py

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
import re
import io
from PIL import Image
import pytesseract
from wand.image import Image as wi



def convert(fname, pages=None,encoding='utf-8'):
    if not pages:
        pagenums = set()
    else:
        pagenums = set(pages)

    output = StringIO()
    manager = PDFResourceManager()
    converter = TextConverter(manager, output, laparams=LAParams())
    interpreter = PDFPageInterpreter(manager, converter)

    infile = open(fname, 'rb')
    for page in PDFPage.get_pages(infile, pagenums):
        interpreter.process_page(page)
    infile.close()
    converter.close()
    text = output.getvalue()
    if len(text)>=500:
        regex3=re.search(r"\d+(?:[.-]\w+)*\s*(General Information|Process validation|Manufacturer(s)Reference Standards or Materials|Container Closure Systems|Stability Summary and Conclusions|Post Approval Stability Protocol and Stability Commitment)",text,re.IGNORECASE)
        return regex3

    else:

        pdffile = wi(filename = fname, resolution = 300)
        pdfImg = pdffile.convert('jpeg')

        imgBlobs = []

        for img in pdfImg.sequence:
            page = wi(image = img)
            imgBlobs.append(page.make_blob('jpeg'))


#        pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
#        extracted_text = []
        for imgBlob in imgBlobs:
            im= Image.open(io.BytesIO(imgBlob))
            text2 = pytesseract.image_to_string(im, lang = 'eng')
        regex3=re.search(r"\d+(?:[.-]\w+)*\s*(General Information|Manufacturer(s)|Process Validation|Batch Formula|Description of Manufacturing Process and Process Controls|Container Closure Systems|Stability Summary and Conclusions|Post Approval Stability Protocol and Stability Commitment)",text2,re.IGNORECASE)
        return regex3



convert(r'D:\files\00ac4250-d746-4c8a-b3-2798b0c2d4f9.pdf')    

我的flask api代码是这样的:叫做app.py

import dtd
from dtd import convert
from flask import Flask, request
from flask_restful import Resource, Api
#from flask.views import MethodView

app = Flask(__name__)
api = Api(app)
#convert(r'D:\files\67cecf40-71cf-4fc4-82e1-696ca41a9fba.pdf')    
class dtdtext(Resource):
    def get(self, result):
        return {'data': dtd.convert(result)}

#api.add_resource(dtdtext, '/dtd/<result>')
categories=convert(r'D:\files\67cecf40-71cf-4fc4-82e1-696ca41a9fba.pdf')    
@app.route('/dtd')

def returnResult():
  return {'data': categories}

if __name__ == '__main__':
     app.run()

dtd.py 将返回类别示例“制造商”的名称,我想将其显示为休息 api。如何有效地做到这一点

500 堆栈跟踪中的内部错误:

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [02/Jul/2019 17:58:42] "GET / HTTP/1.1" 404 -
[2019-07-02 17:58:47,184] ERROR in app: Exception on /dtd [GET]
Traceback (most recent call last):
  File "C:\Users\biltu\Anaconda3\lib\site-packages\flask\app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\biltu\Anaconda3\lib\site-packages\flask\app.py", line 1615, in full_dispatch_request
    return self.finalize_request(rv)
  File "C:\Users\biltu\Anaconda3\lib\site-packages\flask\app.py", line 1630, in finalize_request
    response = self.make_response(rv)
  File "C:\Users\biltu\Anaconda3\lib\site-packages\flask\app.py", line 1740, in make_response
    rv = self.response_class.force_type(rv, request.environ)
  File "C:\Users\biltu\Anaconda3\lib\site-packages\werkzeug\wrappers.py", line 921, in force_type
    response = BaseResponse(*_run_wsgi_app(response, environ))
  File "C:\Users\biltu\Anaconda3\lib\site-packages\werkzeug\test.py", line 923, in run_wsgi_app
    app_rv = app(environ, start_response)
TypeError: 'dict' object is not callable

【问题讨论】:

    标签: python rest flask http-status-code-404 flask-restful


    【解决方案1】:

    你应该声明一个函数,而不是api.add_resource(dtdtext, '/dtd/&lt;result&gt;')

    categories=convert(r'D:\files\67cecf40-71cf-4fc4-82e1-696ca41a9fba.pdf')    
    @app.route('/dtd')
    def returnResult()
      return str({'data': categories})
    

    我并没有真正得到你想要返回的内容,这个返回的是从你的转换函数返回的类别。

    如果您想匹配从 REST api 中的转换函数返回的可用类别,请按如下方式编写路由:

    categories=convert(r'D:\files\67cecf40-71cf-4fc4-82e1-696ca41a9fba.pdf')    
    @app.route('/dtd/<restCategory>')
    def returnResult(restCategory)
      if restCategory in categories:
       DO_SOMETHING_HERE
    

    【讨论】:

    • 如果我给出这个网址,127.0.0.1:5000/dtd 它会给我一个 500 错误。已按建议修改代码,请检查确认。将其添加到问题中
    • 500 是内部服务器错误 - 这意味着代码中存在未捕获的异常。为了帮助解决这个问题,请发布 python 堆栈跟踪
    • 我会发布的。给这个网址127.0.0.1:5000/dtd 正确还是应该只是127.0.0.1:5000
    • 现在您在代码中引入了一个错误:@app ...def ... 之间不能有换行符
    猜你喜欢
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 2013-06-09
    • 2015-04-10
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 2017-09-30
    相关资源
    最近更新 更多