2013-12-05 4 views
4

Итак, у меня есть этот db.model в моей базе данных sqlite в Flask. Это выглядит следующим образом:Какой тип данных следует использовать для изображения в моей базе данных sqlite для колб?

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 

Таким образом, этот вопрос является то, что у меня есть этот столбец, изображение, которое будет реальная картина, но я не знаю, что тип данных для использования в коде колбах.

Вот код Колба: Колба

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} 

Смотрите, где я установить тип моего reqparse из image в blob? Это даже не фактический тип данных, но я не знаю, что туда положить. Нужно ли подклассы fields.Raw? Есть идеи? Благодаря


НОВЫЙ ПОДХОД К ВОПРОСУ

Основываясь на некоторых комментариях, кажется, что я должен хранить изображение в моей статической папке. Я могу это сделать. Но как я могу ссылаться на мою базу данных? Это строка, которая соответствует файлу .jpg?

+0

Почему не хранить местоположение файла изображения в БД? – linbo

+3

Обычно лучше хранить изображения/большие двоичные данные в файловой системе. Не уверен в вашей конкретной реализации SQLite, но большинство этих фреймворков имеют простые способы загрузки/обслуживания изображений в файловую систему и из нее, хранения ключа или пути в БД. Если вы настроены на использование базы данных, возможно, попробуйте: http://stackoverflow.com/questions/11017466/flask-return-image-created-from-database Но будьте осторожны, это будет намного менее эффективно, чем использование файловой системы и обслуживания статические файлы. –

+0

Я предполагаю, что было бы просто иметь изображения в статической папке. Итак, тогда у меня просто будет «String» в моей базе данных, который является путем к самому изображению? Как это работает? Как база данных знает, что это путь, а не просто странная строка? –

ответ

4

parser.add_argument (»картинка», тип = werkzeug.datastructures.FileStorage, местоположение =»Файлы)

+0

+1 и принятый ответ, потому что он не требует использования страницы html и кнопки загрузки, просто запрос API –

4

Обычно изображения, подобные этому, также должны быть загружены из браузера в дополнение к тому, чтобы быть поданным обратно.

По этой причине я использую Flask-Uploads, который обрабатывает все проблемы хранения и именования при загрузке и при подаче.

Вот пример из документации о том, как использовать его:

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) 

используется метод .save() для сохранения входящего файла в каталоге. Flask-Uploads возвращает вам имя файла, с которым оно было сохранено. Позже вы используете .url() или .path(), чтобы получить ссылку на сохраненный файл.

+0

Разве это не устраняет проблему представления в БД? –

+0

Flask-Uploads имеет метод .save(), который будет загружать, хранить его в каталоге и возвращать вам имя файла, которое вы затем можете сохранить в базе данных. Позже, когда вы хотите получить файл, вы используете метод .path(), в который вы передаете сохраненное имя файла, и он вернет вам полный путь к файлу. –

+2

Да, этот ответ на самом деле не говорит вам, как хранить наши изображения в БД. Дело в том, что вы * не * хотите сделать это в любом случае. Вы должны обслуживать файлы изображений, а на самом деле все статическое содержимое, непосредственно из файловой системы и предпочтительно через ваш «настоящий» веб-сервер (apache/nginx/whatever), а не через Flask. –

Смежные вопросы