Django中SQL查询request_id返回None问题求助
Django自定义SQL查询返回None问题排查与解决
核心问题总结
自定义SQL类在Django视图中查询request_id始终返回None,但单独运行test.py能正常获取结果;数据库已存储UUID生成的request_id,导致邮件链接中参数为None。
排查出的关键问题
执行顺序逻辑错误
视图中先执行SQL查询,再判断表单有效性并保存数据。此时用户提交的表单数据还未写入数据库,自然查不到对应结果——单独运行test.py时查询的是已存在的数据,所以能正常返回。SQL语句拼接的语法风险
用format拼接SQL时,若git_Id是字符串类型,未加引号会导致SQL语法错误,直接返回None。同时这种写法存在严重的SQL注入风险。自定义SQL类的资源泄漏问题
update_approval方法中创建数据库连接和游标后未关闭,长期运行可能导致连接池耗尽,引发后续查询异常。类构造函数拼写错误
test.py中的类构造函数写成了__int__,正确写法应为__init__(虽当前未影响功能,但属于不规范写法)。
修复方案
方案1:用Django原生ORM替代自定义SQL(推荐)
完全没必要自己写SQL查询,Django的ModelForm保存后会返回实例,直接从实例获取request_id最可靠:
def index(request): if request.method == "POST": form = InputForm(request.POST) if form.is_valid(): # 先保存表单到数据库,获取保存后的实例 saved_model = form.save() # 直接从实例中拿request_id request_id = saved_model.request_id approve_url = f"http://my_url_path/test?request_id={request_id}" send_mail( 'KSA Test Activation', approve_url, 'my_sender_email_id', ['receiver_id'], fail_silently=False, ) form = InputForm() else: form = InputForm() return render(request, 'home.html', {'form': form})
方案2:修复自定义SQL查询(不推荐,仅作参考)
如果一定要保留自定义SQL类,需做以下修改:
修正构造函数
class sql: def __init__(self): # 把__int__改成__init__ pass改用参数化查询,关闭资源
修改test.py的update_approval方法:def update_approval(self, git_id): d = self.mysql_connection() cursor = d.cursor() # 参数化查询,避免SQL注入和语法错误 query = "SELECT request_id FROM request_form_db.request_form_mymodel where git_Id=%s" cursor.execute(query, (git_id,)) result = cursor.fetchone() # 关闭游标和连接,避免资源泄漏 cursor.close() d.close() # 有结果则返回第一个值,否则返回None return result[0] if result else None调整视图中的执行顺序
必须在表单保存后再执行查询:def index(request): if request.method == "POST": form = InputForm(request.POST) obj = sql() if form.is_valid(): saved_model = form.save() # 用保存后的实例的git_Id查询 p = obj.update_approval(saved_model.git_Id) approve_url = f"http://my_url_path/test?request_id={p}" send_mail( 'KSA Test Activation', approve_url, 'my_sender_email_id', ['receiver_id'], fail_silently=False, ) form = InputForm() print(p) else: form = InputForm() return render(request, 'home.html', {'form': form})
内容的提问来源于stack exchange,提问作者Shaurya Rajput
相关产品推荐
相关产品推荐

