Flask: Is it possible to Mask a URL with variables?

[亡魂溺海] 提交于 2020-08-06 05:45:38

问题


I want to pass variables from a site to another. This is no problem, as there are many ways to do it. I'm struggling though, in how I can 'hide' these variables in the URL, and yet be able to get the values. Ex.: If I use 'request.args.get':

@page.route('/users', methods=['GET', 'POST'])
def users():
    user = request.args.get('user')
    return render_template('users.html', user=user)

When I click in the link, the URL generated is: http://localhost:5000/users?user=john

My goal is to access the 'users' page, in the 'John' section, but what the user will see in the URL path is only http://localhost:5000/users


回答1:


If you'd only want to hide the variable name then you could use converters to create a route like 'users/<str:username>'. Your url would be http://localhost:5000/users/john.

Your can find the documentation here: http://exploreflask.com/en/latest/views.html#built-in-converters

Note that hiding the variables completely would mean, that your users would lose the ability to bookmark the page they are on. Additionaly if they bookmark /users anyways, you would have to catch the case that your variable is not sent or run into errors.




回答2:


Post method can hide data and variables from URL. So you need to integrate it in your project. Here is an example.

app.py:

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/users', methods=['GET', 'POST'])
def show_users():
    if request.method == 'POST':
        username = request.form.get("username", None)
        return render_template('post_example.html', username = username)
    else:
        return render_template('post_example.html')

if __name__ == '__main__':
    app.run(debug = True)

post_example.html:

<html>
  <head></head>
  <body>
    {% if username %}
      Passed username: {{ username }}
    {% endif %}
    <form action="/users" method="post">
      Username: <input type="text" name="username">
      <input type="submit" name="submit" value="Submit">
    </form>
  </body>
</html>

Output:

You can check the HTTP methods in Flask official documentation here




回答3:


I was able to achieve my goal using:

window.history.pushState({"html":response.html,"pageTitle":response.pageTitle},"", "/users/");

I'm no Web Dev'er, just a Python/Flask enthusiast and know that 'window.history.pushState()' is meant for other purposes. I'm also aware that it a HTML5 Feature and not all browsers are compatible. But hey, it did the trick ;) .

Unless someone point out reasons I shouldn't be using this approach, this is my solution.

Thanks all for your time



来源:https://stackoverflow.com/questions/48185043/flask-is-it-possible-to-mask-a-url-with-variables

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!