【发布时间】: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