重新启动flask服务器后,为什么要删除数据库数据?

时间:2020-10-24 03:40:57

标签: python flask sqlalchemy flask-sqlalchemy

最近,我开始了烧瓶。我发现flask-sqlalchemy可用于flask。所以我在用这个。但是我遇到了一些问题。我正在repl.it上。当repl进入睡眠状态时,我尝试与启用了flask的网站一起使用。但是看到没有数据显示。但在此之前,我添加了很多数据。我不知道出什么问题了,但是您能帮我吗?

它可能会帮助您:

from flask_sqlalchemy import SQLAlchemy
import re
from flask import Flask, abort, jsonify, redirect, request
import os

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite3'

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)


class apikey(db.Model):
  apikey = db.Column(db.String(25), primary_key=True, unique = True)
  
  def __init__(self, apikey):
    self.apikey = apikey

class shorturl(db.Model):
  short_query = db.Column(db.String(15), primary_key=True, unique = True)
  original = db.Column(db.String(1000))
  visits = db.Column(db.Integer)
  
  def __init__(self, short_query,original, visits):
    self.short_query = short_query
    self.original = original
    self.visits = visits
  

def url_valid(url):
    return re.match(regex, url) is not None

def bad_request(message):
    response = jsonify({'message': message})
    response.status_code = 400
    return response

def errreq(message):
  response = jsonify({'message': message})
  response.status_code = 404
  return response




@app.route('/')
def show_all():
    return redirect("https://www.cburst.ml", code=301)




@app.route('/addapi', methods=['GET'])
def addapi():
  if request.args.get('apikey') is not None:
    api_key = request.args.get('apikey')
    apiadd = apikey(apikey=api_key)
    db.session.add(apiadd)
    db.session.commit()
    return jsonify({'message':"Done"}), 200
  else:
    return bad_request("Nothing Provided")


@app.route('/add', methods=['POST'])
def add():
  if not request.json:
    return bad_request('Url must be provided in json format.')

  if "original" not in request.json :
    return bad_request('Url parameter not found.')

  if "short_query" not in request.json:
    return bad_request('Url parameter not found.')

  original = request.json['original']
  short = request.json['short_query']


  if shorturl.query.filter_by(short_query = short).first() is not None:
    return bad_request("Already Exists")

  visits = 0

  if original[:4] != 'http':
    original = 'http://' + original
  if not url_valid(original):
      return bad_request('Provided url is not valid.')

  url_db = shorturl(
        short_query=short, original=original, visits=visits)
  shortened_url = short

  db.session.add(url_db)
  db.session.commit()
  return jsonify({'link': shortened_url}), 201


@app.route('/add', methods=['GET'])
def add_get():
  if request.args.get('apikey') is not None and request.args.get('original') is not None and request.args.get('short_query') is not None:
    api_key = request.args.get('apikey')
    original = request.args.get('original')
    short_query = request.args.get('short_query')

    if apikey.query.filter_by(apikey = api_key).first() is None:
      return errreq("Invalid API Key")
    else:
      if shorturl.query.filter_by(short_query=short_query).first() is not None:
        return errreq("Already Exists")
      else:
        if original[:4] != 'http':
          original = 'http://' + original
        if not url_valid(original):
            return bad_request('Provided url is not valid.')
        url_db = shorturl(
        short_query=short_query, original=original, visits=0)
        db.session.add(url_db)
        db.session.commit()
        return jsonify({'link': short_query}), 200
  else:
    return bad_request("Nothing Provided")

@app.route('/view/<alias>', methods=['GET'])
def get_viewcount(alias):
  if shorturl.query.filter_by(short_query=alias).first() is None:
    return bad_request('Unknown alias.')
  else:
      return jsonify({'visits':shorturl.query.filter_by(short_query=alias).first().visits}),200

@app.route('/<alias>', methods=['GET'])
def get_shortened(alias):
    
  if shorturl.query.filter_by(short_query=alias).first() is None:
    return bad_request('Unknown alias.')

  visits = shorturl.query.filter_by(short_query=alias).first().visits

  url_db =  shorturl.query.filter_by(short_query=alias).first()

  url_db.visits = visits + 1

  db.session.commit()
  url = shorturl.query.filter_by(short_query=alias).first().original

  return redirect(url, code=302)


# From https://stackoverflow.com/questions/7160737/python-how-to-validate-a-url-in-python-malformed-or-not#7160778
# Slightly modified to not use ftp.




regex = re.compile(
  r'^(?:http)s?://'
  r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|'
  r'localhost|'
  r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
  r'(?::\d+)?'
  r'(?:/?|[/?]\S+)$', re.IGNORECASE)





if __name__ == '__main__':
  ''' 
  if os.path.exists('./db.sqlite3'):
    app.run(host="0.0.0.0", port=8000, debug=False)
  else: '''
  db.create_all()
  app.run(host="0.0.0.0", port=8000, debug=False)

如果在/ appapi中将api密钥与查询字符串中的密钥一起添加,则可以将密钥添加到数据库中。但是添加到数据库中的密钥会在几个小时后失效。

谢谢。

1 个答案:

答案 0 :(得分:0)

我知道了。这是因为我在主函数中添加了db.create_all()。删除它就可以了。