【问题标题】:Update sqlite3 database from python server file从 python 服务器文件更新 sqlite3 数据库
【发布时间】:2021-11-16 04:42:37
【问题描述】:

我有这个服务器文件的代码:

from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import parse_qs
import sqlite3
import jwt
from datetime import datetime, timedelta

conn = sqlite3.connect('catalog.db')
cursor = conn.cursor()

cursor.execute("""CREATE TABLE IF NOT EXISTS Users(
id INT PRIMARY KEY,
name_lastname TEXT,
account INT,
password TEXT,
token TEXT)
""")

conn.commit()

users = cursor.execute("SELECT * FROM Users")

if (len(users.fetchall()) == 0):
    user = [('1', 'user1', '123', '123', ''),
            ('2', 'user2', '124', '124', ''),
            ('3', 'user3', '125', '125', '')]
    cursor.executemany("INSERT INTO Users VALUES (?, ?, ?, ?, ?)", user)
    conn.commit()

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.log_message("Incoming GET request...")
        try:
            account = parse_qs(self.path[2:])['account'][0]

        except:
            self.send_response_to_client(404, 'Incorrect parameters provided')
            self.log_message("Incorrect parameters provided")
            return

    def do_POST(self):
        self.log_message('Incoming POST request...')
        data_passed = parse_qs(self.path[2:])

        try:
            data = cursor.execute("SELECT %s FROM Users WHERE %s=? and %s=?" %
                                  ("account", "account", "password"),
                                  (data_passed['account'][0],
                                   data_passed['password'][0]), )
            if (len(data.fetchall()) == 0):
                self.send_response_to_client(400, 'Invalid login')
            else:
                encoded = jwt.encode({'account': data_passed['account'][0],
                                      'exp': datetime.utcnow() +
                                             timedelta(seconds=45)}, 'secret',
                                     algorithm='HS256')

                # I gues that code for database update goes here

                self.send_response_to_client(200, 'Token (valid for 45 sec): {}'.format(encoded))

        except KeyError:
            self.send_response_to_client(404, 'Incorrect parameters provided')
            self.log_message("Incorrect parameters provided")

    def send_response_to_client(self, status_code, data):
        self.send_response(status_code)
        self.send_header('Content-type', 'text/plain')
        self.end_headers()
        self.wfile.write(str(data).encode())


server_address = ('127.0.0.1', 8079)
http_server = HTTPServer(server_address, RequestHandler)
http_server.serve_forever()

这是客户端文件的代码:

import requests
import jwt

account = input("Enter your account: ")
password = input("Enter your password: ")

r = requests.post("http://127.0.0.1:8079/", params={'account': account, 'password': password})
print("Request method: POST,  \nResponse status_code: {}, \n" \
          "Response data: {}".format(r.status_code, r.text))

所有这些工作正常,例如。当用户登录时,会生成 jwt 令牌并在控制台(终端)中打印。现在我需要在数据库中为登录用户(基于帐号)在“令牌”字段中写入该令牌,就像这样(UPDATE Users SET token=encoded WHERE account=account)。我尝试了在这里找到的所有解决方案或在谷歌上搜索但没有成功。有人可以帮助正确的语法以及放在哪里吗?

第二部分是在控制台中为登录用户打印数据库中的“Welcome + name_lastname”字段?

【问题讨论】:

  • cursor.execute("UPDATE users SET token = ? WHERE account = ?", (encoded, account))?
  • 请检查代码...我已经尝试过了,错误是这样的:NameError: name 'account' is not defined...可能是因为定义的帐户是客户文件。
  • 然后使用正确的变量。 data_passed['account'][0]
  • 该代码没有错误,但令牌未保存在数据库中
  • 你记得用conn.commit()吗?

标签: python database sqlite jwt


【解决方案1】:
  1. 使用UPDATE 查询将encoded 作为token 添加到用户的行。

  2. 更改SELECT 查询以从表中获取名称,并将其显示在控制台中。

def do_POST(self):
        self.log_message('Incoming POST request...')
        data_passed = parse_qs(self.path[2:])

        try:
            data = cursor.execute("SELECT name_lastname FROM Users WHERE account=? and password=?",
                                  (data_passed['account'][0],
                                   data_passed['password'][0]), )
            row = data.fetchone()
            if not row:
                self.send_response_to_client(400, 'Invalid login')
            else:
                encoded = jwt.encode({'account': data_passed['account'][0],
                                      'exp': datetime.utcnow() +
                                             timedelta(seconds=45)}, 'secret',
                                     algorithm='HS256')

                cursor.execute("UPDATE Users SET token = ? WHERE account = ?", (data_passed['account'][0],))
                self.send_response_to_client(200, 'Welcome {}. Token (valid for 45 sec): {}'.format(row[0], encoded))

        except KeyError:
            self.send_response_to_client(404, 'Incorrect parameters provided')
            self.log_message("Incorrect parameters provided")

【讨论】:

  • 这也可以,但是welcome打印在服务器文件中,我需要将它打印在客户端文件中
  • 我最初把它放在send_response_to_client() 字符串中。但后来我读了这个问题,你说你希望它打印在控制台上,所以我改用了print()
  • 可以在 send_response 中...现在可以正常工作了,再次感谢。
  • 我只是误解了你在问题中所说的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 2021-09-15
相关资源
最近更新 更多