Eliot Branco
Eliot Branco

Reputation: 23

Handle multiple request at same time on Flask web app

What I have: I've a Flask web app deployed to Heroku's server, which consists of only one web process app.py. Here it is:

    #importation
from flask import Flask, render_template, current_app, send_file, request, json, send_file
import  os

#working functions
#json write
def json_write(dictionary):
    with open("./json/info.json", "w+") as f:
        json.dump(dictionary, f, indent=4)

#make file name
def make_file_name(name):
    filename = "tube4u_"
    for t in str(name):
        if t.isalnum():
            filename += t
    filename += ".mp4"
    return filename
    
            
    


#application initialisation
app=Flask(__name__)

#home
@app.route("/")
def home():
    return render_template("index.html")

#processor  
@app.route("/process/", methods=["GET"])
def process():
    #get url
    url = request.args["url"]
    #import & initialisation
    from pytube import YouTube
    import pickle
    json_dict = {}
    try:
        yt = YouTube(url)
    except:
        return "<h1>Invalid URL</h1>"
    all_videos = yt.streams.filter(type="video", progressive=True)
    json_dict["title"] = yt.title
    json_dict["thumbnail"] = yt.thumbnail_url
    json_dict["name"] = make_file_name(yt.title)
    with open("./pickle/ytobj.pkl", "wb") as f:
        pickle.dump(all_videos, f)
    #videos with itag
    json_dict["videos"] = [ {"itag": item.itag, "res": item.resolution} for item in all_videos]
    json_write(json_dict)
    return render_template("menu.html")

#download
@app.route("/download/", methods=["GET"])
def download():
    import pickle
    itag = int(request.args["itag"])
    with open("./json/info.json") as f:
        json_dict = json.load(f)
    with open("./pickle/ytobj.pkl", "rb") as f:
        all_videos = pickle.load(f)
    video = all_videos.get_by_itag(itag)
    video.download(output_path="./video", filename=f"{json_dict['name']}")
    return render_template("thank.html")
    
#return video
@app.route("/video/", methods=["GET"])
def video():
    filename = request.args["filename"]
    return send_file(f"./video/{filename}", as_attachment=True)
    
#return json
@app.route("/json")
def fetchjson():
    with open("./json/info.json") as f:
        content = json.load(f)
    return content
    
#get name 
@app.route("/name")
def fetchname():
    with open("./json/info.json") as f:
        content = json.load(f)
    return content
    
@app.route("/list")
def listall():
    return f"{os.listdir('./video')}"
    
    
#running the app
if __name__ == "__main__":
    app.run(debug=True)

How it works: here I made the app like that, whenever someone enter a URL and click Go then it creates a json file with the name info.json. after it gets everything properly it performs some task with the given URL reading from the file.

My problem: Now the problem is, if I make a request of the web it will create a json with my given URL, suppose at the same time someone else make a request and enter a URL then server will lost my information and rewrite the json file with another client's given input URL my task will be performed with another's input url. It's really weird.

How to fix it? Like if there any way to create the info.json file on separate path for each client and gets deleted after work done?

Upvotes: 0

Views: 1143

Answers (1)

Akrash Nadeem
Akrash Nadeem

Reputation: 98

There is a lot of ways in my point of view

  1. When the server get client request then check if there is already a file.if there is already a file then add timestamp or add something else in the filename so the file will not be overwritten.
  2. Ask the user file name and also add timestamp in the name and save it.
  3. You can also use databases to store data of different clients .may be you can create login system and give every user an id and store data for every user in database accordingly.

So on...

You can see there is a lot of ways to solve this.

Upvotes: 1

Related Questions