简体   繁体   English

Flask无法从sqlalchemy获取数据

[英]Flask can't get data from sqlalchemy

I can't understand why I can't get data from SQLAlchemy in the Flask functions and templates. 我不明白为什么我无法在Flask函数和模板中从SQLAlchemy获取数据。 Here is code: 1. main.py 这是代码:1. main.py

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    from flask import Flask, jsonify, request, g, render_template as render
    from models import *
    from settings import *
    from flask_httpauth import HTTPBasicAuth


    ALLOWED_EXTENSIONS = set(EXTENSIONS)
    auth = HTTPBasicAuth()

    app = Flask(__name__)
    app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER


    @app.route('/')
    def home_page():
        brands = [item.serialize for item in session.query(Category).all()]
        items = []
        title = ''
        print brands
        return render('catalog/index.html', brands=brands, cars=items, titlr=title)


    if __name__ == '__main__':
        app.debug = True
        app.run(host='0.0.0.0')
  1. models.py: models.py:

     #!/usr/bin/env python # -*- coding: utf-8 -*- from sqlalchemy import Column, Integer, String, ForeignKey, DateTime from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship, sessionmaker from sqlalchemy import create_engine from passlib.apps import custom_app_context as pwd_context from itsdangerous import TimedJSONWebSignatureSerializer as Serializer from itsdangerous import BadSignature, SignatureExpired from data_control import get_unique_str Base = declarative_base() # initialisation the database secret_key = get_unique_str(32) # create secret_key # create session engine = create_engine('sqlite:///catalog.db') Base.metadata.bind = engine DBSession = sessionmaker(bind=engine) session = DBSession() # TODO: User model class User(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True) username = Column(String(32), index=True) picture = Column(String(250), default='/img/no-img.png') first_name = Column(String(25), default=None) last_name = Column(String(25), default=None) email = Column(String(40)) password_hash = Column(String(64)) status = Column(String(10), default='user') def hash_password(self, password): """ hash password :param password: :return void: """ self.password_hash = pwd_context.encrypt(password) def verify_password(self, password): """ Password verification :param password: :return bool: """ return pwd_context.verify(password, self.password_hash) @property def get_full_name(self): """ Return full name (first and last name) :return string: """ return "%s %s" % (self.first_name, self.last_name) def generate_auth_token(self, expiration=3600): """ Generate authentication token :param expiration: :return string: (token) """ s = Serializer(secret_key, expires_in=expiration) return s.dumps({'uid': self.id}) @staticmethod def verify_auth_token(token): """ Try to load token, success return user id false return None :param token: :return mix: """ s = Serializer(secret_key) try: data = s.loads(token) except SignatureExpired: # Valid Token, but expired return None except BadSignature: # Invalid Token return None uid = data['uid'] return uid @property def serialize(self): """ Return user data :return dict: """ return { 'id': self.id, 'username': self.username, 'picture': self.picture, 'first_name': self.first_name, 'last_name': self.last_name, 'email': self.email, 'status': self.status } # TODO: Image model class Image(Base): __tablename__ = 'image' id = Column(Integer, primary_key=True) product = Column(Integer, nullable=False) url = Column(String(250)) @property def serialize(self): """ Return user data :return dict: """ return { 'id': self.id, 'url': self.url } # TODO: Category model class Category(Base): __tablename__ = 'category' id = Column(Integer, primary_key=True) name = Column(String(30)) @property def serialize(self): """ Return user data :return dict: """ return { 'id': self.id, 'name': self.name } # TODO: Catalog model class Catalog(Base): __tablename__ = 'catalog' id = Column(Integer, primary_key=True) model = Column(String(30)) title = Column(String(250)) description = Column(String(250)) category = Column(Integer, ForeignKey("category.id"), nullable=False) price = Column(Integer, nullable=False) author = Column(Integer, ForeignKey("user.id"), nullable=False) def get_author(self): """ Return product`s author :return object: """ return session.query(User).filter_by(id=self.author).one().serialize def get_images(self): """ Prepare list of images for JSON :return list: """ images = session.query(Image).filter_by(product=self.id).all() return [img.serialize for img in images] def get_category(self): """ Return category :return object: """ category = session.query(Category).filter_by(id=self.category).first() return category.serialize @property def serialize(self): """ Return user data :return dict: """ return { 'id': self.id, 'model': self.model, 'title': self.title, 'description': self.description, 'brand': self.get_category(), 'price': self.price, 'images': self.get_images(), 'author': self.get_author(), } Base.metadata.create_all(engine) 

    in template: 在模板中:

     {% extends 'base.html' %} {% block title %}{{ title }}{% endblock %} {% block content %} <div class="row"> {{ brands }} {% for item in brands %} <div>{{ item.name }}</div> {% endfor %} {% for car in cars %} <div class="col-sm-4 col-lg-4"> <div class="col-sm-6 col-lg-4 mb-5"> <span class="tumbl-image" data-ng-click="main.showDescription()" image-bg="{{ car.images[0].url }}"> <div class="hide description">{{ car.description }}</div> </span> <div class="pt-2 text-center" id="title-link"> <a href="/car/{{ car.id }}">{{ car.title }}</a> </div> <div class="pt-2"> <span data-ng-click="main.sendEmail(item.author.email)" class="mail-to"> <i class="fa fa-envelope-o" aria-hidden="true"></i> </span> <a href="/profile/{{ car.author.id }}">{{ car.author.first_name }} {{ item.author.last_name }}</a> </div> </div> </div> {% endfor %} </div> {% endblock %} 

if I run app and go to localhost:5000 I see [] 如果我运行应用程序并转到localhost:5000,我会看到[]

in terminal: 在终端:

* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 342-567-684

[] 127.0.0.1 - - [11/Dec/2017 15:34:00] "GET / HTTP/1.1" 200 - [] 127.0.0.1--[11 / Dec / 2017 15:34:00]“ GET / HTTP / 1.1” 200-

but if I run python console: 但是如果我运行python控制台:

    PyDev console: starting.
    import sys; print('Python %s on %s' % (sys.version, sys.platform))
    sys.path.extend(['/path/to/catalog'])
    Python 2.7.10 (default, Jul 15 2017, 17:16:57) 
    [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
    >>> from main import *
    >>> brands = [item.serialize for item in session.query(Category).all()]
    >>> print brands
    [{'id': 1, 'name': u'BMW'}, {'id': 2, 'name': u'Ford'}, {'id': 3, 'name': u'Nissan'}, {'id': 4, 'name': u'Toyota'}, {'id': 5, 'name': u'Dodge'}, {'id': 6, 'name': u'Audi'}, {'id': 7, 'name': u'Jeep'}, {'id': 8, 'name': u'Mazda'}, {'id': 9, 'name': u'Chevrolet'}]

Would someone please tell me why flask doesn't output data? 有人可以告诉我为什么烧瓶不输出数据吗? Thanks in advance. 提前致谢。

I spent two days to find solution, but problem was with PyCharm. 我花了两天时间找到解决方案,但问题出在PyCharm上。 I don't know why, but for some reason if i try to run the app in PyCharm SQLAlchemy stops working. 我不知道为什么,但是由于某些原因,如果我尝试在PyCharm SQLAlchemy中运行该应用程序,它将停止工作。 If I run the app in terminal, it works well. 如果我在终端中运行该应用程序,它将运行良好。

PS I hope this helps someone. PS我希望这可以帮助某人。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM