【问题标题】:How to Solve this " TypeError: read() missing 1 required positional argument: 'self' " [duplicate]如何解决这个“TypeError:read()缺少1个必需的位置参数:'self'”[重复]
【发布时间】:2019-02-13 12:08:17
【问题描述】:

我正在使用 Flask 创建一个 REST api 来获取存储在 MSSQL 数据库中的所有书籍。当我简单地运行此代码并在控制台中打印数据时,它工作得很好。但是当我作为 Flask API 运行并尝试在邮递员中获取所有数据时,它会显示此错误:

完整的追溯:

Traceback (most recent call last):
     File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 2309, in __call__
        return self.wsgi_app(environ, start_response)
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 2295, in wsgi_app
        response = self.handle_exception(e)
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 1741, in handle_exception
        reraise(exc_type, exc_value, tb)
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\_compat.py", line 35, in reraise
        raise value
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 2292, in wsgi_app
        response = self.full_dispatch_request()
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
        rv = self.handle_user_exception(e)
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
        reraise(exc_type, exc_value, tb)
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\_compat.py", line 35, in reraise
        raise value
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
        rv = self.dispatch_request()
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 1799, in dispatch_request
        return self.view_functions[rule.endpoint](**req.view_args)
    TypeError: read() missing 1 required positional argument: 'self'
    127.0.0.1 - - [13/Feb/2019 17:38:21] "GET / HTTP/1.1" 500 -
    Traceback (most recent call last):
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 2309, in __call__
        return self.wsgi_app(environ, start_response)
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 2295, in wsgi_app
        response = self.handle_exception(e)
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 1741, in handle_exception
        reraise(exc_type, exc_value, tb)
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\_compat.py", line 35, in reraise
        raise value
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 2292, in wsgi_app
        response = self.full_dispatch_request()
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
        rv = self.handle_user_exception(e)
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
        reraise(exc_type, exc_value, tb)
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\_compat.py", line 35, in reraise
        raise value
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
        rv = self.dispatch_request()
      File "C:\Users\raj.pandey\Desktop\Flask_API\lib\site-packages\flask\app.py", line 1799, in dispatch_request
        return self.view_functions[rule.endpoint](**req.view_args)
    TypeError: home() missing 1 required positional argument: 'self'

这是我出错的代码:

class MssqlConnection:
    def __init__(self):
        credentials = Credentials()
        self.driver = credentials.driver
        self.host = credentials.host
        self.database = credentials.database
        self.table = credentials.table
        self.user = credentials.user
        self.password = credentials.password

    @app.route('/books')
    def read(self):
        query = "Select id, name, price, isbn from dbo." + self.table
        cursor.execute(query)
        for row in cursor:
            data = {
                'id': row.id,
                'name': row.name,
                'price': row.price,
                'isbn': row.isbn
            }
            # print(data)
            return jsonify(data)

我已经检查过了,但仍然无法理解问题所在。

【问题讨论】:

  • 能否请您添加完整的 Traceback?
  • 是的,等一下
  • 为什么要将“self”参数传递给def read()home() 相同 ...
  • self.table 为此。在初始化后的类中,每个 def 都得到了自己。没有它我无法访问“self.variable”
  • 先生,你能把你的邮件ID发给我吗,因为我不能在这里放那么多代码?所以我会把我的代码发给你。

标签: python-3.x rest flask


【解决方案1】:

您的端点函数可能不在(甚至不应该)在一个类中。只需从 def read(self): 行中删除 self 参数就可以了。在类范围内编码时,应使用“self”作为参数。您不在班级范围内。所以解决方案是def read():

在 Flask 中,只有当你在你的 url 中加入一个参数,比如app.route('/books/<somevariable>'),你才应该将somevariable 作为参数传递给端点函数并写成def myfunction(somevariable):

您可以阅读相关文档: http://flask.pocoo.org/docs/1.0/quickstart/#variable-rules

【讨论】:

  • 通过从read() 方法中删除self,类变量table 不再可访问
  • joey sir 是对的,并且 def read 是在一个类范围内我没有在这里放置完整的代码,因为它很长。
  • 但是flask认为“self”是url中的一个变量。您可以使用全局变量或创建服务对象并从那里访问您的数据。
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 2023-02-06
  • 2021-09-15
  • 2013-07-06
  • 2022-01-05
  • 2017-03-28
  • 2020-01-07
相关资源
最近更新 更多