I think Flask is an amazing Python framework because it is versatile and flexible. Although there are drawbacks to using Flask instead of Django such as with Flask you have to implement many features that would come out of the box with Django. For example, with Django, you get a really good admin panel without any effort, but with Flask you have to write the whole admin panel yourself using Flask Security or Flask Login with Flask Admin -- these packages together can help you to be able to code a completed admin panel that allows an administrator to do backend stuff and maintain the web application. With Django, the admin panel that comes out of the box looks very nice. Somehow though, perhaps I could be wrong but I've found Django's admin panel, even with extensive personal customization, a heavy custom Django admin panel is still looking too similar to the one that comes out of the box. With Flask, since you have to code this yourself and depending on how much time and effort you put into the admin panel, it could look completely alien from one programmer's Flask admin panel to the next.
I have learned Python for a couple of months or so, and I have found Flask is easier to work with than Django -- I fondly remembered I started with Django first -- and I had a hard time with making Django's routing of internal paths to the way I like it. With Flask though, it's simple as:
@app.route('/') def home_page(): custom code goes here return render_template('index.html', some_variable_to_pass_into_Jinja2_template=whatever)
The piece of code above would render an index.html page for a website using Flask. The decorator @app refers to the Flask app itself, and the route part is where the custom method home_page would render the template's index.html page -- in this case, the forward-slash ('/') would be a shortcut to render the index.html page. Now, let's say you have a contact page where a web visitor could email you or so, how would you route this?
@app.route('/contact') def contact_page(): custom code goes here return render_template('contact.html', whatever=whatever, blah=blah, contact_form=contact_form)
So, when a visitor goes to 'yourwebsite.yourdomain-name/contact -- Flask would render the contact.html page.
I like how Flask routes internal paths like this because it's so easy to see what is going on -- not like Django's black box. If you take a look at the custom code immediately after the @app.route, you would right away know that the block of codes belongs to what template's page of the website.
I have heard a lot of people love to use Flask for writing RESTful API, and I actually had done this once as a practice exercise. I could definitely see why people love Flask for this very purpose -- it's so easy to just jsonify the data using Flask. Once you have jsonify the data, you can totally choose how you would like to return these data when a request is made to the app using Flask. Nonetheless, recently I have been using Flask to just create small websites -- not RESTful API -- and this is fresher in my mind than doing RESTful API.
To sum it up, I just scratch the surface of what Flask can do in this blog post. Based on my own experience, I've found Flask is easier to work with than Django. Deploying the Flask web app felt easier than Django too. For example, once I'd finished writing a Flask web app, all I had to do was initialize a GitHub repository, commit, and push the web app to GitHub. Afterward, I could use Heroku or PythonAnywhere to host my Flask web app either through the free tier or paid tier. Setting up Flask with Heroku or PythonAnywhere isn't that hard. The key is to double-check the requirements.txt to make sure all required packages that Flask needs to run your web app are listed in this file. Heroku and PythonAnywhere rely on this file to install necessary third-party Python packages. Once you set up the necessary steps for Heroku or PythonAnywhere, the last thing you only have to do is to pull your app's source from GitHub onto Heroku or PythonAnywhere. On Heroku's CLI, you can just do [git push heroku main], and on PythonAnywhere Bash console you can just do [git pull].
Anywho, I just completed coding a Portfolio website using Flask. The main feature of this website is to allow a user to add various project showcases so he or she can show off the projects. The website relies on Bootstrap 5 and custom CSS I'd written -- this means the whole website is responsive to various screen sizes, including mobile phones. In desktop mode, the website showcase two projects one at a time through the pagination feature -- allowing visitors to flip to more projects by clicking next or back to previous projects. In mobile mode, I used lazy load to load the first few showcase projects' images -- then the rest would be loaded on-demand as the website visitors could forever scroll downward till all projects had been loaded. Check out the finished product on https://pythongenex.pythonanywhere.com/.