Mam więc ten db.model w mojej bazy danych Sqlite w kolbie. To wygląda tak:

class Drink(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), index = True)
    kind = db.Column(db.String(64), index = True)
    image = db.Column(db.LargeBinary)

    def __init__(self, name, kind, image):
        self.name = name
        self.kind = kind
        self.image = image

    def __repr__(self):
        return '<Drink %r>' % self.name

Tak więc ten problem polega na tym, że mam tę kolumnę, obraz, który będzie rzeczywistym zdjęciem, ale nie wiem, jaki typ danych używany w kodzie kolby.

Oto kod kolby: kolba

class DrinkAPI(Resource):
    def __init__(self):
        self.reqparse = reqparse.RequestParser()
        self.reqparse.add_argument('name', type = str, required = True, help = 'No name title provided', location = 'json')
        self.reqparse.add_argument('type', type = str, required = True, help='No type provided', location = 'json')
        self.reqparse.add_argument('image', type = blob, required = True, help='No image provided', location = 'json')
        super(DrinkAPI, self).__init__()

    def get(self, id):
        if checkDrink(id):
            info = getDrinkInfo(id)
            return {'id': id, 'name': info[0], 'type':info[1], 'image': info[2]}
        abort(404)

    def put(self, id):
        if checkDrink(id):
            args = self.reqparse.parse_args()
            deleteDrink(id)
            drink = Drink(args['name'], args['type'], args['image'])
            addDrink(drink)
            return {'drink' : marshal(drink, drink_fields)}, 201 
        abort(404)

    def delete(self, id):
        deleteDrink(id)
        return { 'result': True}

Zobacz, gdzie ustawię typ mojego reqparse image do blob? To nie jest nawet rzeczywisty typ danych, ale nie wiem, co tam umieścić. Czy muszę podklasy fields.Raw? Jakieś pomysły? Dzięki


nowe podejście do pytania

Na podstawie niektórych komentarzy wydaje się, że powinienem przechowywać obraz w moim folderze statycznym. Mogę to zrobić. Ale w jaki sposób odwołuję się z moją bazą danych? Czy jest to ciąg odpowiada pliku .jpg?

4
Alex Chumbley 5 grudzień 2013, 08:17

2 odpowiedzi

Najlepsza odpowiedź

Parser.add_Argument ("obraz", typ = wkrzeug.datstructure.Filestorage, lokalizacja = "pliki")

5
Mojiiz 3 luty 2014, 05:33

Normalnie obrazy, które również muszą być przesyłane z przeglądarki oprócz serwowania.

Z tego powodu używam Flask-Uploads który obsługuje wszystkie problemy z przechowywaniem i nazwiskami podczas przesyłania i po podaniu.

Oto przykład od doktorów, jak go używać:

photos = UploadSet('photos', IMAGES)

@app.route('/upload', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST' and 'photo' in request.files:
        filename = photos.save(request.files['photo'])
        rec = Photo(filename=filename, user=g.user.id)
        rec.store()
        flash("Photo saved.")
        return redirect(url_for('show', id=rec.id))
    return render_template('upload.html')

@app.route('/photo/<id>')
def show(id):
    photo = Photo.load(id)
    if photo is None:
        abort(404)
    url = photos.url(photo.filename)
    return render_template('show.html', url=url, photo=photo)

Używasz metody .Save () do przechowywania pliku przychodzącego w katalogu. Ładowniki kolby powraca do Ciebie nazwa pliku została zapisana. Później używasz .url () lub .path (), aby uzyskać odniesienie do zapisanego pliku.

4
David K. Hess 7 grudzień 2013, 21:24