微网络框架中的全局变量

时间:2014-05-10 06:23:15

标签: python-2.7 web bottle

我正在使用瓶子构建一个小型的微型Web应用程序。第一步是用户将ID输入表单以便检索记录。一旦ID被验证为SQLite数据库的一部分,将采取进一步的步骤,他们可以修改记录,使用相同的PRIMARY KEY将数据添加到另一个.db,依此类推。

我的问题是,在会话中如何在验证后保留ID并将其传递给各种功能。它应该是在验证用户输入的函数内部创建的全局吗?我对全局变量持谨慎态度,只因为有很多垃圾被人们讨论过。另外,我很紧张,如果管理不善,用户可以重新启动会话,输入新数据,但全局ID变量可能没有被妥善处理等....

解决这个问题的正确方法是什么?

我不确定它有用,但这是我目前使用的代码....

import bottle as bt
import webbrowser as wb
import re, sqlite3

@bt.route('/welcome', method = 'GET')
def welcome():
    return """
    <!DOCTYPE html>
    <html>
    <head>
    <title>Bottle Micro-Web Test Application</title>
    </head>
        <body>
            <div style="text-align:center;">
                <h1>Welcome to the Factory Database Test Micro-Web Application</h1>
            <div/>
            <div style="text-align:left;">
                <h2>To call up a record please enter a valid UID in the box below:<h2>
            <div/>
            <form action="/welcome/result" method="post">
                UID: <input type="text" name="UID"><br/>
                <input value="Get Records" type="submit">
            </form>
            <body>
    <html>
    """

@bt.route('/welcome/result', method = 'POST')
def report_welcome():
    uid = bt.request.forms.get('UID')
    return check_user_input(uid)

def check_user_input(uid):
    uid_pattern = re.compile("[Mm]\d\d\d")
    if not uid_pattern.match(uid):
        return """
        <!DOCTYPE html>
        <html>
        <head>
        <title>Bottle Micro-Web Test Application</title>
        </head>
            <body>
                <font size="6" color="red">That was an invalid UID!</font>
                <p> A valid UID has the form M001</p>
                <form action="http://localhost:8080/welcome">
                <input type="submit" value="Back">
                </form>
            <body>
        <html>
        """
    else:
        uid = uid.upper()
        conn = sqlite3.connect('factories.db')
        c = conn.cursor()
        result = tuple(c.execute("SELECT uid FROM factories WHERE uid = ?", (uid,)))
        if result:
            c.execute("SELECT * FROM factories WHERE uid = ?", (uid,))
            record = c.fetchone()
            conn.close()
            return bt.template("{{record}}", record = str(record))
        else:
            return """
            <!DOCTYPE html>
            <html>
            <head>
            <title>Bottle Micro-Web Test Application</title>
            </head>
                <body>
                    <font size="6" color="red">That UID does not exist in the database</font>
                    <form action="http://localhost:8080/welcome">
                    <input type="submit" value="Back">
                    </form>
                <body>
            <html>
            """

wb.open('http://localhost:8080/welcome')
bt.run(host = 'localhost', port = 8080, debug = True)

1 个答案:

答案 0 :(得分:0)

如果你想将id用于单个请求,那么传递你想要做的局部变量比使用全局变量更好。

如果要保留请求中的id,可以将值保存在cookie中(如果不考虑id的安全性),则可以轻松访问它。 Cookie将保存在用户的计算机上,并且只能在请求期间访问。有关在瓶子中使用cookie的更多信息,请参阅瓶子的文档(在教程中对此进行了解释)。

另外:不要在代码中嵌入html使用模板!它会让你的代码更整洁。