Python(flask)BLOB图像,SQLite,Sqlalchemy显示imag

2024-03-29 05:22:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将图像作为BLOB数据类型存储在sqlite数据库中,然后在网页上显示图像,但我一直收到一个sqlalchemy错误(使用sqlalchemy作为ORM),错误:

sqlalchemy.exc.StatementError
StatementError: buffer object expected (original cause: TypeError: buffer object expected) u'INSERT INTO room (owner_name, size, description, price, address, owner_number, room_image, university_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?)' [{'owner_name': u'Thomas Jefferson', 'description': u'Master Bedroom, Non-furnished, toilet attached', 'price': u'RM650/Month', 'room_image': <FileStorage: u'udacity.png' ('image/png')>, 'university_id': 1, 'address': u'Cyber Heights Villa', 'size': u'325sqft', 'owner_number': u'+60111223456'}]

以下是我的代码: 1.)我的数据库设置文件(文件室表中有BLOB列):

import sys
from sqlalchemy.dialects.sqlite import BLOB
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import create_engine
Base = declarative_base()


class University(Base):

    __tablename__ = "university"

    #column definitions for the university table
    id = Column(Integer, primary_key=True)
    name = Column(String(250), nullable=False)
    city = Column(String(80), nullable=False)

    @property
    def serialize(self):
        #Returns object data in easilty serializable format
        return{
            "name": self.name,
            "city": self.city,
            "id": self.id,
        }


class Room(Base):

    __tablename__ = "room"

    #column definitions for the room table
    owner_name = Column(String(90), nullable=False)
    id = Column(Integer, primary_key=True)
    size = Column(String(60))
    description = Column(String(250))
    price = Column(String(10))
    address = Column(String(250))
    owner_number = Column(String(15))
    room_image = Column(BLOB)
    university_id = Column(Integer, ForeignKey("university.id"))
    university = relationship(University)

engine = create_engine("sqlite:///gotroom.db")
Base.metadata.create_all(engine)

2.)这是我的python文件代码,我打算在其中允许将图像作为BLOB上载到room_image(在newRoom函数中,照片图像的上载将在此处进行,并存储在room_image列中,我的房间表中):

#show rooms for a university
@app.route("/university/<int:university_id>/")
@app.route("/university/<int:university_id>/rooms/")
def showRooms(university_id):
    university = session.query(University).filter_by(id=university_id).one()
    rooms = session.query(Room).filter_by(university_id=university_id).all()
    return render_template("rooms.html", rooms=rooms, university=university)


#create a new room for a particular university
@app.route("/university/<int:university_id>/rooms/new/", methods=["GET", "POST"])
def newRoom(university_id):
    if request.method == "POST":
        aNewRoom = Room(owner_name=request.form["ownerName"], size=request.form["roomSize"]\
                       , description=request.form["roomDescription"], price=request.form["roomPrice"]\
                        , address=request.form["adress"], owner_number=request.form["phoneNum"], \
                        room_image=request.files["roomImage"], university_id=university_id)

        session.add(aNewRoom)
        session.commit()

        #feedback to user
        flash("New Room Created")       

        return redirect(url_for("showRooms", university_id=university_id))
    else:
        return render_template("newroom.html", university_id=university_id)

3.)这是用于创建新文件室“new room.html”的表单模板代码(我必须允许上载图像):

<form action="{{url_for('newRoom', university_id=university_id)}}" method="POST" enctype='multipart/form-data'>
    <div class="row">
        <div class="col-md-4">
            <input type="text" class="form-control" name="ownerName" placeholder="Name">
        </div>

        <div class="col-md-3">
            <input type="text" class="form-control" name="phoneNum" placeholder="Contact Number">
        </div>

        <div class="col-md-5">
            <input type="text" class="form-control" name="adress" placeholder="Address">
        </div>
    </div><!--first row-->
    </br>
    <div class="row">
        <div class="col-md-2">
            <input type="text" class="form-control" name="roomSize" placeholder="Room Size">
        </div>

        <div class="col-md-2">
            <input type="text" class="form-control" name="roomPrice" placeholder="Room Price/Month">
        </div>
    </div><!--second row-->
    </br>
    <div class="row">
        <div class="col-md-4" style="height: 100px">
            <input type="text" class="form-control" name="roomDescription" placeholder="Room Details" style="height: 100%">
        </div>
        <input type='file' name='roomImage'>
    </div>
    </br>

    <input type="submit" value="Post Room" class="btn btn-success btn-lg" role="button">

</form> 

4.)下面是模板代码,我想在其中显示包括图像在内的所有信息:

        </br>

        <img src="{{room.room_image}}">
        <strong>Owner Name</strong>: {{room.owner_name}}

        </br>
        <strong>Contact Number</strong>: {{room.owner_number}}
        </br>
        <strong>Home Address</strong> : {{room.address}}
        </br>
        <strong>Room Price</strong> : {{room.price}}
        </br>
        <strong>Room Size</strong>  : {{room.size}}
        </br>
        <strong>Room Description</strong>: {{room.description}}
        <div>

任何时候我删除图像,我都不会得到错误,但一旦我试图显示图像,错误就会回来,有谁能帮我解决这个问题?如果需要,我可以提供更多的细节或代码


Tags: name图像brdivformidstringsqlalchemy
1条回答
网友
1楼 · 发布于 2024-03-29 05:22:01

从这个错误看来,你试图传递错误的类型。我相信BLOB需要一个二进制文件,而您传递的是png。有一个make_blob()方法可用于将图像转换为二进制文件。检查this页面,应该会有所帮助。

相关问题 更多 >