解决self.encoding = charset_by_name(self.charset).encoding

本文介绍如何使用Python连接MySQL数据库并创建数据表。通过两种不同方式展示连接配置,并指出使用字典参数传递配置信息可能导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决self.encoding = charset_by_name(self.charset).encoding

解决self.encoding = charset_by_name(self.charset).encoding

 

 1 def createMysqlTable(tablename):
 2     # config = {
 3     #     "host":"localhost",
 4     #     "user":"root",
 5     #     "password":"root",
 6     #     "database":"test",
 7     #     "charset": "utf-8",
 8     #     "port":"3306"
 9     # }
10     mysqlDB = pymysql.connect("localhost","root","root","test",3306,charset="utf8")

 

当我们使用Python操作MySQL数据库时,可能会遇到一些问。比如:我们可能需要自己创建一张数据表,在建立数据表之前,我们需要先与数据库建立连接,如上面的代码所示,但是当我们使用上面的代码就没有什么问题,可以正常运行,

但是,当我们使用下面的代码时,可能会报错,

 1 def createMysqlTable(tablename):
 2     config = {
 3         "host":"localhost",
 4         "user":"root",
 5         "password":"root",
 6         "database":"test",
 7         "charset": "utf-8",
 8         "port":"3306"
 9     }
10     mysqlDB = pymysql.connect(**config)

错误如下所示:

我们只要使用第一种方法就不会出错。

connect的参数设置,如下图所示:

 

posted @ 2019-03-26 15:53 东京的樱花在巴黎飘下 阅读( ...) 评论( ...) 编辑 收藏
现在有settings配置参数: DB_HOST='192.168.231.128' DB_PORT=3306 DB_USER='root' DB_PASSWORD='1234' DB_NAME='test' DB_CHARSET='utf-8' 和管道配置文件: from1 scrapy.utils.projectt importt get_project_settings import pymysql class MysqlPipeline(object): #init_方法和open_spider的作用是一样的 #init是获取settings中的连接参数 definit_(self): settings=get_project_settings() self.hostt = settings['DB_HOST'] self.port=settings['DB_PORT'] self.user = settings['DB_USER'] self.pwd = ssettings['DB_PWD'] self.namee = settings['DB_NAME'] self.charset = settings['DB_CHARSET'] self.connect() #连接数据库并且获取cursor对象 def connect(self): self.conn = pymysql.connect(host=self.host, port=self.port, user=self.user, password=self.pwd, db=self.name, password=self.pwd, db=self.name, charset=self.charset) self.cursor = self.conn.cursor() def process_item(self, item, spider): sql = 'insert into book(image_url, book_name, author, info) values("%s", "%s", "%s", "%s")′ % (item['image_url'], item['book_name'], item['author'], item['infd sql = 'insert into book(image_url,book_name,author,info) values ("{}","{}","{}","{}")'.format(item['image_url'], item['book_name'], item['author'], item['info']) # 执行sql语句 self.cursor.execute(sql) self.conn.commit() return item def close_spider(self, spider): self.conn.close() self.cursor.close() 请根据以上两个文件运用python代码编写爬虫代码爬取"https://www.pythontab.com/html/pythonjichu/"网站的文章标题,作者,存入一个csv文件中。
03-10
File "waypoint_navigator.py", line 12 SyntaxError: Non-ASCII character '\xe5' in file waypoint_navigator.py on line 12, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details 根据报错修改#!/usr/bin/env python3 import rospy import actionlib from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal from geometry_msgs.msg import PoseStamped, Quaternion from tf.transformations import quaternion_from_euler class WaypointNavigator: def __init__(self): rospy.init_node('ucar_navigation_node', anonymous=True) # 创建move_base动作客户端 self.client = actionlib.SimpleActionClient('move_base', MoveBaseAction) rospy.loginfo("等待move_base服务器...") self.client.wait_for_server() rospy.loginfo("已连接move_base服务器") # 定义目标点列表 (x, y, theta) self.waypoints = [ (1.5, 0.8, 0.0), # 点1 (2.2, -1.0, 1.57), # 点2 (0.5, -1.5, 3.14) # 点3 ] def create_goal(self, x, y, theta): """创建导航目标点""" goal = MoveBaseGoal() goal.target_pose.header.frame_id = "map" goal.target_pose.header.stamp = rospy.Time.now() # 设置位置 goal.target_pose.pose.position.x = x goal.target_pose.pose.position.y = y # 设置朝向 (欧拉角转四元数) q = quaternion_from_euler(0, 0, theta) goal.target_pose.pose.orientation = Quaternion(*q) return goal def navigate(self): """执行顺序导航""" for wp in self.waypoints: goal = self.create_goal(*wp) rospy.loginfo(f"导航至目标点: ({wp[0]}, {wp[1]})") # 发送目标点 self.client.send_goal(goal) # 等待执行结果 (超时60秒) success = self.client.wait_for_result(rospy.Duration(60)) if success: state = self.client.get_state() rospy.loginfo(f"到达目标点! 状态: {state}") else: rospy.logwarn("导航超时或失败") self.client.cancel_goal() if __name__ == '__main__': try: navigator = WaypointNavigator() navigator.navigate() rospy.loginfo("所有目标点导航完成!") except rospy.ROSInterruptException: rospy.logerr("程序中断")
07-15
import tkinter as tk from tkinter import filedialog from PIL import Image, ImageTk import cv2 import numpy as np from tensorflow.keras.models import load_model class DigitRecognitionApp: def __init__(self, master): self.master = master self.master.title("数字识别器") # 加载预训练MNIST模型 self.model = load_model('mnist_model.h5') # 需提前训练或下载 # 创建UI组件 self.create_widgets() def create_widgets(self): # 上传按钮 self.btn_upload = tk.Button(self.master, text="上传图片", command=self.upload_image) self.btn_upload.pack(pady=10) # 图片显示 self.image_label = tk.Label(self.master) self.image_label.pack() # 识别按钮 self.btn_recognize = tk.Button(self.master, text="识别数字", command=self.recognize_digit) self.btn_recognize.pack(pady=10) # 结果显示 self.result_label = tk.Label(self.master, text="识别结果:", font=('Arial', 14)) self.result_label.pack(pady=10) def upload_image(self): file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.png;*.jpg;*.jpeg")]) if file_path: image = Image.open(file_path) image.thumbnail((200, 200)) photo = ImageTk.PhotoImage(image) self.image_label.config(image=photo) self.image_label.image = photo self.image_path = file_path def recognize_digit(self): try: # 预处理图像 img = cv2.imread(self.image_path, cv2.IMREAD_GRAYSCALE) img = cv2.resize(img, (28, 28)) img = img.reshape(1, 28, 28, 1).astype('float32') / 255 # 进行预测 prediction = self.model.predict(img) digit = np.argmax(prediction) self.result_label.config(text=f"识别结果:{digit}") except Exception as e: self.result_label.config(text="识别失败:" + str(e)) if __name__ == "__main__": root = tk.Tk() app = DigitRecognitionApp(root) root.mainloop() 修改要求:上传的图片中不管是中文、英文、数字,都要识别出来
04-04
import webbrowser webbrowser.open("https://ai.csdn.net/?utm_source=cknow_pc_ntoolbar") # 默认浏览器打开 webbrowser.open_new_tab("https://8000.com") # 新标签页打开 import tkinter as tk import numpy as np from datetime import datetime, timedelta import random from urllib.request import urlopen from lxml import etree import chardet class WeatherForecastApp: def __init__(self, root): self.root = root self.root.title("24 小时天气预报 - 南昌") self.root.geometry("900x600") self.root.configure(bg="#f0f8ff") # 初始化数据 self.current_time = datetime.now() self.temperature_data, self.weather_conditions = self.fetch_weather_data() # 创建顶部标题 self.title_label = tk.Label( root, text=f"{self.current_time.strftime('%Y 年%m月%d日')} 24小时天气预报 - 南昌", font=("微软雅黑", 16, "bold"), bg="#4682b4", fg="white", padx=20, pady=10 ) self.title_label.pack(fill=tk.X) # 创建主框架 self.main_frame = tk.Frame(root, bg="#f0f8ff") self.main_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10) # 创建左侧信息面板 self.info_frame = tk.Frame(self.main_frame, bg="#e6f2ff", bd=2, relief=tk.RAISED) self.info_frame.pack(side=tk.LEFT, fill=tk.Y, padx=(0, 20), pady=10) # 当前天气信息 current_temp = self.temperature_data[-1][1] current_weather_condition = self.weather_conditions[-1] tk.Label(self.info_frame, text="当前天气", font=("微软雅黑", 12, "bold"), bg="#e6f2ff").pack(pady=(10, 5)) self.current_weather = tk.StringVar() self.current_weather.set(f" 温度: {current_temp}°C\n条件: {current_weather_condition}") tk.Label(self.info_frame, textvariable=self.current_weather, bg="#e6f2ff", justify=tk.LEFT).pack(pady=5) # 预测信息 tk.Label(self.info_frame, text="预测信息", font=("微软雅黑", 12, "bold"), bg="#e6f2ff").pack(pady=(15, 5)) self.forecast_info = tk.StringVar() self.update_forecast_info() tk.Label(self.info_frame, textvariable=self.forecast_info, bg="#e6f2ff", justify=tk.LEFT).pack(pady=5) # 创建图表区域 self.chart_frame = tk.Frame(self.main_frame, bg="white", bd=2, relief=tk.SUNKEN) self.chart_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, pady=10) self.canvas = tk.Canvas(self.chart_frame, bg="white", width=600, height=400) self.canvas.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) # 创建控制面板 self.control_frame = tk.Frame(root, bg="#f0f8ff") self.control_frame.pack(fill=tk.X, padx=20, pady=(0, 10)) self.update_btn = tk.Button( self.control_frame, text="更新预测", command=self.update_forecast, bg="#4caf50", fg="white", font=("微软雅黑", 10), padx=15 ) self.update_btn.pack(side=tk.LEFT) self.simulate_btn = tk.Button( self.control_frame, text="模拟变化", command=self.toggle_simulation, bg="#2196f3", fg="white", font=("微软雅黑", 10), padx=15 ) self.simulate_btn.pack(side=tk.LEFT, padx=10) self.status_var = tk.StringVar() self.status_var.set(" 就绪") tk.Label(self.control_frame, textvariable=self.status_var, bg="#f0f8ff", font=("微软雅黑", 10)).pack(side=tk.RIGHT) # 初始化绘图 self.draw_chart() self.simulation_active = False def fetch_weather_data(self): try: url = "https://tianqi.2345.com/nanchang/58606.htm" response = urlopen(url) html = response.read() # 检测网页编码 result = chardet.detect(html) encoding = result['encoding'] html = html.decode(encoding) tree = etree.HTML(html) # 提取温度和天气状况数据 temperature_data = [] weather_conditions = [] now = datetime.now() # 这里需要根据实际网页结构调整 XPath temp_nodes = tree.xpath('//div[@class="hours-weather"]//span[@class="tem"]/text()') weather_nodes = tree.xpath('//div[@class="hours-weather"]//span[@class="wea"]/text()') for i in range(min(24, len(temp_nodes), len(weather_nodes))): temp = float(temp_nodes[i].replace('℃', '')) weather = weather_nodes[i] time_point = now - timedelta(hours=23 - i) temperature_data.append((time_point, temp)) weather_conditions.append(weather) return temperature_data, weather_conditions except Exception as e: print(f"获取天气数据时出错: {e}") # 生成初始数据作为备用 return self.generate_initial_data(), ["晴天"] * 24 def generate_initial_data(self): """生成初始24小时温度数据""" # 使用NumPy创建时间序列 hours = np.arange(24) # 使用正弦函数模拟温度变化 (白天高,夜晚低) base_temp = 20 + 8 * np.sin(2 * np.pi * (hours - 6) / 24) # 添加随机波动 random_variation = np.random.normal(0, 1.5, 24) temperatures = np.round(base_temp + random_variation, 1) # 创建时间-温度数据对 now = datetime.now() data = [] for i, temp in enumerate(temperatures): time_point = now - timedelta(hours=23 - i) data.append((time_point, temp)) return data def draw_chart(self): """在画布上绘制温度折线图""" self.canvas.delete("all") # 获取画布尺寸 canvas_width = self.canvas.winfo_width() canvas_height = self.canvas.winfo_height() if canvas_width < 100 or canvas_height < 100: return # 防止初始化时尺寸过小 # 设置边距 margin = 50 chart_width = canvas_width - 2 * margin chart_height = canvas_height - 2 * margin # 绘制坐标轴 self.canvas.create_line(margin, margin, margin, margin + chart_height, width=2) # Y轴 self.canvas.create_line(margin, margin + chart_height, margin + chart_width, margin + chart_height, width=2) # X轴 # 计算温度范围 temps = [item[1] for item in self.temperature_data] min_temp = min(temps) max_temp = max(temps) temp_range = max_temp - min_temp temp_range = max(temp_range, 12) # 确保最小范围 # 添加Y轴刻度和标签 for i in range(6): # 6个刻度 value = min_temp + (i * temp_range / 5) y = margin + chart_height - (i * chart_height / 5) self.canvas.create_line(margin - 5, y, margin, y, width=1) self.canvas.create_text(margin - 10, y, text=f"{value:.1f}°C", anchor="e", font=("Arial", 9)) # 添加X轴刻度和标签 points = [] for i, (time_point, temp) in enumerate(self.temperature_data): x = margin + (i * chart_width / 23) y = margin + chart_height - ((temp - min_temp) / temp_range) * chart_height points.append((x, y)) # 每2小时显示一个时间标签 if i % 2 == 0: self.canvas.create_line(x, margin + chart_height, x, margin + chart_height + 5, width=1) self.canvas.create_text( x, margin + chart_height + 15, text=time_point.strftime("%H:%M"), font=("Arial", 9) ) # 在时间标签下方显示天气状况 weather = self.weather_conditions[i] self.canvas.create_text( x, margin + chart_height + 30, text=weather, font=("Arial", 9) ) # 绘制折线 if len(points) > 1: for i in range(1, len(points)): x1, y1 = points[i - 1] x2, y2 = points[i] self.canvas.create_line(x1, y1, x2, y2, fill="#1e88e5", width=3, smooth=True) # 绘制数据点 for x, y in points: # 根据温度选择点颜色 temp = min_temp + ((margin + chart_height - y) / chart_height) * temp_range color = "#ff5252" if temp > 25 else "#1e88e5" # 高温红色,低温蓝色 self.canvas.create_oval(x - 5, y - 5, x + 5, y + 5, fill=color, outline=color) # 在点上方显示温度值 if points.index((x, y)) % 3 == 0: # 每3小时显示一次温度 self.canvas.create_text(x, y - 15, text=f"{temp:.1f}°C", font=("Arial", 9), fill="#333") # 添加当前时间标记 last_x, last_y = points[-1] self.canvas.create_line(last_x, margin, last_x, margin + chart_height, fill="#4caf50", dash=(4, 2), width=2) self.canvas.create_text( last_x, margin - 20, text="当前时间", fill="#4caf50", font=("Arial", 10, "bold") ) # 添加标题 self.canvas.create_text( canvas_width / 2, 20, text="24小时温度变化趋势 - 南昌", font=("微软雅黑", 12, "bold"), fill="#333" ) def update_forecast_info(self): """更新预测信息""" temps = [item[1] for item in self.temperature_data] max_temp = max(temps) min_temp = min(temps) avg_temp = np.mean(temps) # 找出最高温和最低温的时间 max_index = temps.index(max_temp) min_index = temps.index(min_temp) max_time = self.temperature_data[max_index][0].strftime("%H:%M") min_time = self.temperature_data[min_index][0].strftime("%H:%M") info = f"最高温度: {max_temp:.1f}°C ({max_time})\n" info += f"最低温度: {min_temp:.1f}°C ({min_time})\n" info += f"平均温度: {avg_temp:.1f}°C\n" info += f"天气变化: {random.choice([' 稳定', '逐渐升温', '小幅波动'])}" self.forecast_info.set(info) def update_forecast(self): """更新天气预报""" self.status_var.set(" 更新预测中...") self.root.update() # 重新获取天气数据 self.temperature_data, self.weather_conditions = self.fetch_weather_data() # 更新当前天气显示 current_temp = self.temperature_data[-1][1] current_weather_condition = self.weather_conditions[-1] self.current_weather.set(f" 温度: {current_temp}°C\n条件: {current_weather_condition}") # 更新预测信息 self.update_forecast_info() # 重绘图表 self.draw_chart() self.status_var.set(" 预测已更新") def toggle_simulation(self): """切换模拟状态""" if not self.simulation_active: self.simulation_active = True self.simulate_btn.config(text=" 停止模拟") self.status_var.set(" 模拟运行中...") self.simulate_changes() else: self.simulation_active = False self.simulate_btn.config(text=" 模拟变化") self.status_var.set(" 模拟已停止") def simulate_changes(self): """模拟天气变化""" if not self.simulation_active: return # 更新数据:移除最旧的数据点,添加新的数据点 self.temperature_data.pop(0) self.weather_conditions.pop(0) # 基于当前时间生成新数据点 current_time = datetime.now() # 基于前一个温度值生成新温度(加入随机变化) last_temp = self.temperature_data[-1][1] hour = current_time.hour # 根据一天中的时间调整变化方向 if 6 <= hour < 12: # 早晨升温 change = random.uniform(0.1, 1.5) elif 12 <= hour < 18: # 下午可能降温 change = random.uniform(-0.5, 0.5) else: # 晚上降温 change = random.uniform(-1.5, -0.1) new_temp = round(last_temp + change, 1) new_weather = random.choice([" 晴天", "多云", "小雨", "阴天", "雷阵雨"]) self.temperature_data.append((current_time, new_temp)) self.weather_conditions.append(new_weather) # 更新UI self.current_weather.set(f" 温度: {new_temp}°C\n条件: {new_weather}") self.update_forecast_info() self.draw_chart() # 安排下一次更新 self.root.after(990000, self.simulate_changes) if __name__ == "__main__": root = tk.Tk() app = WeatherForecastApp(root) root.mainloop() 不能用import chardet 库和其他外置库,只能用import tkinter as tk import numpy as np from datetime import datetime, timedelta import random from urllib.request import urlopen from lxml import etree 库,修改后的完整代码
最新发布
07-16
import os import re import json from datetime import datetime from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.primitives import padding from cryptography.hazmat.backends import default_backend from binascii import hexlify, unhexlify from rest_framework import parsers, renderers from rest_framework.compat import coreapi, coreschema from rest_framework.response import Response from rest_framework.schemas import ManualSchema from rest_framework.views import APIView from rest_framework.authtoken.models import Token from rest_framework.authtoken.serializers import AuthTokenSerializer from django.contrib import auth from django.http import QueryDict from django.shortcuts import HttpResponse from django.views.generic.base import View from django.contrib.auth.hashers import make_password, check_password from .models import * from case.models import CaseType from users.models import ScoreModel from .utils import send_register_email from fcdaserver.rest_framework.views import ViewBase class UserPermissions(ViewBase): def put(self, request): exam_type = request.data.get("exam_type") user = request.user if user.is_active: user.exam_type = exam_type user.save() response_data = {"code": 0, "msg": ""} else: response_data = {"code": 1, "msg": "用户没有激活!"} return self.json_response(data=response_data) class ResetPwd(ViewBase): def post(self, request): old_word = request.data.get("old_pwd", "") new_pwd = request.data.get("new_pwd", "") user = auth.authenticate(username=request.user.username, password=old_word) if user is not None: if user.is_active: user.set_password(new_pwd) user.save() response_data = {"code": 0, "msg": ""} else: response_data = {"code": 1, "msg": "用户未激活!"} else: response_data = {"code": 1, "msg": "用户名或密码错误!"} return self.json_response(data=response_data) class MyAuthToken(APIView): throttle_classes = () permission_classes = () parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,) renderer_classes = (renderers.JSONRenderer,) serializer_class = AuthTokenSerializer if coreapi is not None and coreschema is not None: schema = ManualSchema( fields=[ coreapi.Field( name="username", required=True, location='form', schema=coreschema.String( title="Username", description="Valid username for authentication", ), ), coreapi.Field( name="password", required=True, location='form', schema=coreschema.String( title="Password", description="Valid password for authentication", ), ), ], encoding="application/json", ) def post(self, request, *args, **kwargs): username = request.data.get("username") password = request.data.get("password") user_obj = UserProfile.objects.filter(username=username).first() if user_obj: if not check_password(password, user_obj.password): return Response({"code": 1, "msg": "密码不正确!"}) if user_obj.sn and user_obj.is_active: current_time = datetime.now().timetuple() active_time = user_obj.sn.active_time.timetuple() if int(time.mktime(current_time)) - int(time.mktime(active_time)) > 60 * 60 * 24 * user_obj.sn.expire_date: user_obj.sn.is_valid = False else: user_obj.sn.is_valid = True user_obj.sn.save() if Token.objects.filter(user=user_obj).exists(): token_key = hexlify(os.urandom(20)).decode() Token.objects.filter(user=user_obj).update(key=token_key, created=datetime.now()) token_info = Token.objects.filter(user=user_obj).first() else: token_info = Token.objects.create(user=user_obj) UserProfile.objects.filter(username=username).update(last_login=datetime.now()) if user_obj.sn.is_valid: return Response({"code": 0, "msg": token_info.key}) else: return Response({"code": 1, "msg": "当前账户已过期!请联系管理员!"}) else: return Response({"code": 1, "msg": "用户未激活!请联系管理员!"}) else: return Response({"code": 1, "msg": "用户不存在!"}) class UserRegister(View): def post(self, request, *args, **kwargs): username = request.POST.get("username", "") nickname = request.POST.get("nickname", "") email = request.POST.get("email", "") password = request.POST.get("password", "") serial_number = request.POST.get("serial_number", "") response_data = {"code": 0, "msg": ""} if username == "": response_data = {"code": 2, "msg": "用户名不允许为空!"} elif nickname == "": response_data = {"code": 2, "msg": "昵称不允许为空!"} elif password == "": response_data = {"code": 2, "msg": "密码不允许为空!"} elif email == "": response_data = {"code": 2, "msg": "邮箱不允许为空!"} elif serial_number == "": response_data = {"code": 2, "msg": "序列号不允许为空!"} if response_data["code"] != 0: return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") if not username.isalnum(): response_data = {"code": 3, "msg": "用户名包含非法字符!"} elif re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", email) == None: response_data = {"code": 3, "msg": "邮箱格式不正确!"} if response_data["code"] != 0: return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") if UserProfile.objects.filter(username=username).exists(): response_data = {"code": 1, "msg": "用户名已存在!"} else: serial_number_obj = SerialNumber.objects.filter(serial_number=serial_number).first() if not serial_number_obj or not serial_number_obj.is_valid: response_data = {"code": 2, "msg": "序列号已经过期!"} else: encrypt_pwd = make_password(password, None, 'pbkdf2_sha256') UserProfile.objects.create(username=username, nick_name=nickname, password=encrypt_pwd, email=email, sn=serial_number_obj, is_active=False) serial_number_obj.active_time = datetime.now() serial_number_obj.save() send_register_email(username, email) response_data = {"code": 0, "msg": ""} return HttpResponse(content=json.dumps(response_data, indent=4,), content_type="application/json;charset=UTF-8") class UserActive(View): def post(self, request): email_code = request.POST.get("email_code", "") response_data = {"code": 0, "msg": ""} if email_code == "": response_data = {"code": 2, "msg": "验证码无效"} if response_data["code"] == 0: email_record_obj = EmailVerifyRecord.objects.filter(code=email_code).first() if email_record_obj: user_obj = UserProfile.objects.filter(username=email_record_obj.username, email=email_record_obj.email).first() user_obj.is_active = True user_obj.save() user_group_obj = UserGroup.objects.get(name="默认组") user_group_obj.user.add(user_obj) response_data = {"code": 0, "msg": "用户已激活"} else: response_data = {"code": 2, "msg": "验证码无效"} return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") class UserAuthentication(View): def get(self, request): username = request.GET.get("username") user_obj = UserProfile.objects.filter(username=username).first() if user_obj: response_data = {"code": 0, "msg": "验证码已发送至您的邮箱,请注意查收!"} send_register_email(username, user_obj.email, send_type="reset_pwd") else: response_data = {"code": 1, "msg": "用户不存在"} return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") def post(self, request): username = request.POST.get("username") password = request.POST.get("password") user_obj = UserProfile.objects.filter(username=username).first() if user_obj: if user_obj.is_active: user_obj.set_password(password) user_obj.save() response_data = {"code": 0, "msg": ""} else: response_data = {"code": 1, "msg": "用户未激活!"} else: response_data = {"code": 1, "msg": "用户名或密码错误!"} return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") def put(self, request): put = QueryDict(request.body) username = put.get("username") email_code = put.get("email_code") email_record_obj = EmailVerifyRecord.objects.filter(username=username, code=email_code).first() if email_record_obj: response_data = {"code": 0, "msg": "验证成功!"} else: response_data = {"code": 1, "msg": "验证失败!"} return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") class EditPersonalInformation(ViewBase): def get(self, request): username = request.GET.get("username") user_obj = UserProfile.objects.filter(username=username).first() if user_obj: temp = { "username": username, "nickname": user_obj.nick_name, "email": user_obj.email, "phone": user_obj.first_name } response_data = {"code": 0, "msg": "", "data": temp} else: response_data = {"code": 1, "msg": "用户名获取失败!"} return self.json_response(data=response_data) def post(self, request): username = request.POST.get("username") nickname = request.POST.get("nickname") email = request.POST.get("email") phone = request.POST.get("phone") user_obj = UserProfile.objects.filter(username=username).first() if user_obj: user_obj.nick_name = nickname user_obj.email = email user_obj.first_name = phone user_obj.save() response_data = {"code": 0, "msg": "修改成功!"} else: response_data = {"code": 1, "msg": "用户名获取失败!"} return self.json_response(data=response_data) class ScoreView(ViewBase): def post(self, request): stage_id = request.POST.get("stageId") question_number = request.POST.get("questionNo") score = request.POST.get("score") try: ScoreModel.objects.create(user=request.user, stage_id=stage_id, question_number=question_number, score=score) return self.json_response(data={"code": 0, "msg": "提交成功!"}) except Exception as e: print(e) return self.json_response(data={"code": -1, "msg": "提交失败!"}) def get_key(key): # 确保密钥是字节串类型 if isinstance(key, str): key = key.encode('utf-8') # 填充或截断密钥以确保长度为 16 字节 key = key.ljust(16, b'\x00')[:16] return key def encode2hex(src, key): try: key = get_key(key) cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=default_backend()) encryptor = cipher.encryptor() padder = padding.PKCS7(algorithms.AES.block_size).padder() padded_data = padder.update(src.encode('utf-8')) + padder.finalize() encrypted = encryptor.update(padded_data) + encryptor.finalize() return hexlify(encrypted).decode('utf-8') except Exception as e: print(f"encode2hex fail: {e}") return None def decode4hex(src, key): try: key = get_key(key) cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=default_backend()) decryptor = cipher.decryptor() unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder() encrypted_bytes = unhexlify(src) decrypted = decryptor.update(encrypted_bytes) + decryptor.finalize() decrypted_padded = unpadder.update(decrypted) + unpadder.finalize() return decrypted_padded.decode('utf-8') except Exception as e: print(f"decode4hex fail: {e}") return None class CheckIdCard(View): def post(self, request): id_card = request.POST.get("id_card", "") if id_card == "": response_data = {"code": 2, "msg": "参数无效!"} return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") id_card = decode4hex(id_card, "loginqwert@12345") user_obj = UserProfile.objects.filter(id_card=id_card).first() if user_obj and id_card: if user_obj.is_active: if Token.objects.filter(user=user_obj).exists(): token_key = hexlify(os.urandom(20)).decode() Token.objects.filter(user=user_obj).update(key=token_key, created=datetime.now()) token_info = Token.objects.filter(user=user_obj).first() else: token_info = Token.objects.create(user=user_obj) UserProfile.objects.filter(username=user_obj.username).update(last_login=datetime.now()) if user_obj.sn.is_valid: response_data = {"code": 0, "msg": "", "token": token_info.key, "username": user_obj.username} else: response_data = {"code": 1, "msg": "当前账户已过期!请联系管理员!"} else: response_data = {"code": 1, "msg": "用户未激活!"} else: response_data = {"code": 1, "msg": "此用户不存在!"} return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") 逐行解析
05-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值