Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为特定用户生成唯一的url_Python_Authentication_Flask_Access Token_User Experience - Fatal编程技术网

Python 如何为特定用户生成唯一的url

Python 如何为特定用户生成唯一的url,python,authentication,flask,access-token,user-experience,Python,Authentication,Flask,Access Token,User Experience,我正在使用flask构建一个web应用程序,并将数据存储在一个名为Orders的表中 我希望买家能够访问一个模板,该模板将显示他们的订单数据,如跟踪、状态等。我还希望为他们提供一些操作,如返回订单的能力 出于方便和用户体验的目的,我不希望买家注册。我想通过电子邮件给他们发送一个链接,直接让他们访问订单信息。因此,我将使用令牌为每个订单创建一个动态路由。我也不希望那个标记是非常明显的,比如订单号或类似的东西,因为这样任何人都可以猜出一个url并返回一个不是他们的订单。所以它必须是唯一的,并且是一个

我正在使用flask构建一个web应用程序,并将数据存储在一个名为Orders的表中

我希望买家能够访问一个模板,该模板将显示他们的订单数据,如跟踪、状态等。我还希望为他们提供一些操作,如返回订单的能力

出于方便和用户体验的目的,我不希望买家注册。我想通过电子邮件给他们发送一个链接,直接让他们访问订单信息。因此,我将使用令牌为每个订单创建一个动态路由。我也不希望那个标记是非常明显的,比如订单号或类似的东西,因为这样任何人都可以猜出一个url并返回一个不是他们的订单。所以它必须是唯一的,并且是一个随机字符的长字符串。我应该怎么做,这是一个好的方法还是一个糟糕的设计


谢谢大家!

尝试为您的订单使用
UUID
,它可以作为相关路由中的查询参数传递。您可以将其创建为:

import uuid

hard_to_guess_string = uuid.uuid4()
another_string = uuid.uuid4()

是的,您可以使用flask中的变量规则进行操作,您可以在url中放置一个路径,如下所示:

@app.route('/user/<path:dinamicPath>')
def show_subpath(dinamicPath):
   if dinamicPath == 'order':
      order = Order.get() #get your orderns from db or files
      return render_template('order.html', order=order)
   elif dinamicPath == 'otherStuff':
      ...
      return

@app.route(“/user/”)
def显示_子路径(dinamicPath):
如果dinamicPath=='order':
order=order.get()#从数据库或文件中获取订单
返回呈现模板('order.html',order=order)
elif dinamicPath==“其他材料”:
...
返回
“因此,我将使用令牌为每个订单创建一个动态路由。我也不希望该令牌非常明显,比如订单号或类似的东西”您可以使用UUID,它也在可变规则中受支持,您可以查看此链接,文档中只说:“生成随机UUID”,无法保证它是否使用加密随机生成器(即,随机值是否难以猜测)。甚至指定UUID的RFC4122也表示,版本4的UUID是由“真正的随机数或伪随机数”生成的,同样没有任何加密质量保证

为了产生-

  • 难以猜测的价值
  • 必须由最终用户键入的,以及
  • 充当承载凭证,其仅拥有权就授予对其标识的资源的访问权(明确不鼓励的用例)
UUID不合适。而是导入并生成如下随机字符串:
secrets.token\u hex(16)
甚至
secrets.token\u hex(20)
。请注意,与
uuid
不同,
secrets
模块被记录为生成加密随机值。另见


也应考虑添加某种形式的授权,如确认电子邮件地址等,如果你觉得你可以这样做而不加重用户负担。此外,您还应该考虑订单和跟踪信息的临时性质。< /P> Python。请看第一个答案。谢谢你的回答。该模块生成唯一的令牌?因此,我会生成一个令牌,将其存储在数据库中的订单列中,用url向用户发送电子邮件,当访问该动态路由时,我应该通过令牌查询数据库过滤。我考虑过信息的临时性,但我不确定如何处理它。我的意思是,为了记帐,订单数据可能需要存储一段时间,可能需要在一段时间后删除订单?使用
机密生成的字符串。令牌\u hex(16)
是唯一的,概率极高(就像UUID一样)。根据您对重复风险的容忍度,您可能需要检查字符串在数据库中的唯一性。我只是想让您大致了解订单数据的临时性质;我无法回答您是否必须在特定情况下删除、保留或保留可用的数据。但是uuid和secrets都使用os.uradom,因此secrets token_hex没有任何好处,请参阅@void:尽管当前版本的
uuid
secrets
可能是这种情况,
uuid
不记录加密随机生成器的使用。如果您认为这是一个问题,请在bugs.python.org上提交一个问题,建议在这方面为
uuid
提供更好的文档。