Вход в бутылку с sqlite3 - PullRequest
       6

Вход в бутылку с sqlite3

0 голосов
/ 09 января 2019

Я хочу создать механизм входа в систему - bottle & sqlite3

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

from bottle import Bottle, route, run, template, get, post, debug, static_file, request, redirect, response
import time
import random
import string
import logging
import logging.handlers
import sqlite3

log = logging.getLogger('bottle')
log.setLevel('INFO')
h = logging.handlers.TimedRotatingFileHandler(
    'logs/nlog', when='midnight', backupCount=9999)
f = logging.Formatter('%(asctime)s %(levelname)-8s %(message)s')
h.setFormatter(f)
log.addHandler(h)


secretKey = "SDMDSIUDSFYODS&TTFS987f9ds7f8sd6DFOUFYWE&FY"


from users import users

app = Bottle()


@app.route('/static/:path#.+#', name='static')
def static(path):
    return static_file(path, root='./static')


def checkAuth():
    conn = sqlite3.connect('trainsdb2.db')
    c = conn.cursor()
    c.execute('SELECT * FROM LoginData WHERE login="%s" AND password="%s"' %(loginName,password))
    loginName = request.get_cookie("user", secret=secretKey)
    log.info(str(loginName) + ' ' + request.method + ' ' +
             request.url + ' ' + request.environ.get('REMOTE_ADDR'))
    if c.fetchone() is not None: 
        return loginName
        conn.commit()
        conn.close()
    conn.commit()
    conn.close()    
    return redirect('/login')


@app.route('/login')
@app.route('/login/')
@app.route('/login', method='POST')
def login():
    conn = sqlite3.connect('trainsdb2.db')
    c = conn.cursor()
    loginName = request.forms.get('login_name', default=False)
    password = request.forms.get('password', default=False)
    log.info(str(loginName) + ' ' + request.method + ' ' +
             request.url + ' ' + request.environ.get('REMOTE_ADDR'))
    c.execute('SELECT * FROM LoginData WHERE login="%s" AND password="%s"' %(loginName,password))

    if c.fetchone() is not None: 
        response.set_cookie("user", loginName, secret=secretKey)
        log.info = ('not none')
        conn.commit()
        conn.close() 
        redirect('/index')
        return True
    else:
        conn.commit()
        conn.close() 
        return template('login')
    conn.commit()
    conn.close() 
    return template('login')


@app.route('/')
@app.route('/index')
@app.route('/index/')
@app.route('/index/<message>')
def index(message=''):
    loginName = checkAuth()
    messDict = {'error': "Something went wrong",
                'ok': "Everything is ok."}
    return template('index', message=messDict.get(message, ""), loginName=loginName)

app.run(host='localhost', port=63700, reloader=False, debug=True)

У меня есть простая база данных, я имею в виду одну таблицу и две переменные varchar. Однако, когда я ввожу пароль и логин, которые совпадают со значениями, хранящимися в базе данных, ничего не происходит, и я все еще на той же странице, что и раньше. Принимая во внимание, что я должен был быть перенаправлен на главную страницу. Это почему?

Как решить эту проблему? Что можно улучшить?

1 Ответ

0 голосов
/ 10 января 2019

Декораторы на победу.

from bottle import get, request, redirect, response, template

secretKey = "SDMDSIUDSFYODS&TTFS987f9ds7f8sd6DFOUFYWE&FY"

class User(object):
    def __init__(self):
        self.name = None
        self.cookiedata = request.get_cookie("USER", secret=secretKey)
        if self.cookiedata:
            self.name = self.cookiedata['username']

    def login(self, cookiedata):
        return response.set_cookie("USER", cookiedata, path='/', httponly='on', secret=secretKey)

def require_uid(fn):
    def check_uid(**kwargs):
        if request.get_cookie("USER", secret=secretKey):
            return fn(**kwargs)
        else:
            redirect("/login")
    return check_uid

@get('/')
@get('/index')
@get('/index/')
@get('/index/<message>')
@require_uid
def index(message=''):
    user = User()
    return template('index', loginName=user.name)

Ваша страница входа в систему просто проверит, есть ли у них cookie, или войдет в них через форму и создаст cookie.

Затем для любого маршрута, на котором вы хотите установить безопасность, просто добавьте @require_uid, или он перенаправит их на страницу входа.

...