By Ankur Tiwari | Last edited on 20-01-2020Follow @Ankurt04
Medium Reader? You can read this article on medium. Don't forget to clap!
I am not a professional product reviewer. However I am getting into this uncharted terrain and reviewing PythonAnywhere (PA).
Back in 2016, I was doing a bit of Embedded C and PHP, when internet’s high decibel machine learning rush hit me. Realizing the limits of my skills, I pivoted to Python. One thing led to another and I decided to follow Lean Development Methodology to quickly launch a website and then improve it gradually. Flask was selected and I started with Flask Mega Tutorial.
Next came the search for Python web hosting service. After a few days of research, I couldn’t really made up my mind. But since I really wanted to get started, I chose a nd signed up for PythonAnywhere.
Even after significant research about Python website hosting service, I could not understand various moving parts clearly. I selected Pythonanywhere based on a hunch.
PythonAnywhere is a web hosting company which offers hosting solution for Python web applications. One can use it to host Python web apps and scripts. It’s a 7 years old company based in London.
I’m reviewing PythonAnywhere for following reasons:
The goal here is to simplify and present enough information so that you can take a well-informed decision, instead of relying on hunch or PR articles.
So if you are wondering “is PythonAnywhere good?” or “should I use PythonAnywhere for web hosting?”, sit tight, we are about to discover the truth.
These are the core offerings of PythonAnywhere. “Code, Run and Host” are the words they focus on. This word-set means that you can open PythonAnywhere.com on any web browser to:
In this review, we will see how PythonAnywhere fares on these promises among many other things.
This is a product review by a user. The way I'm going to do this is to break the product experience into multiple smaller parts and examine each one independently.
When you google “how to do something”, you are looking for the exact information to complete a task and move ahead.
When you want to select a web app hosting provider, you are looking for the information to help you make best decision. Once a decision has been made, you want to complete the signup process and validate your decision quickly.
Hence, You want to move from a stage of confusion to a stage of achievement. Fast.
User's journey to value discovery:
All you want is to quickly and reliably move from step 1 to 6.
PythonAnywhere does a great job in helping its users in this journey. It takes them from a stage of confusion to a stage of achievement in just 9 clicks, within a few minutes. Yes, 9 clicks to have your working Python website shinning on internet!
Alright, so it is a simple “Hello World” website. No fancy stuff. But now you have a fully functional website accessible from any corner of internet.
I once used a very popular hosting service to host a simple Flask web app. It took me four days to reach this stage. Had to read multiple documents and configure many settings. As if this was not enough, it got so confusing at a point that I had to delete everything twice. It worked in third attempt. Mental fatigue and loss of tempo were extra costs.
What PythonAnywhere does is to give you a fully configured Python environment. So, if you are building a Flask web application, all you need is to make a few mouse clicks and voila! Flask environment is ready; start writing your code.
PythonAnywhere web hosting for Django, Flask, web2py and Bottle, all follow this simple approach to build your first live web app in minutes.
There is nothing more assuring than seeing a functioning website just in a minute or two.
I thought nothing of PythonAnywhere’s user interface at the beginning. It did not attracted my attention. I simply went about building and hosting my Flask web app. However a few months into using the service, I realized that I never had to google “how to do this on PythonAnywhere” related to user interface.
Every flow and control that I needed to run my Flask website was their in front of me, in its simplest form.
I further understood the importance of ‘simple and minimal’ UI when I tested another hosting provider for a new website. I had won a coupon and wanted to redeem it. The efforts required to understand how to use the service was overwhelming. Buttons, drop-downs and links everywhere. Hours spent wondering where to click and where to go in each step. After a lot of time & efforts, my Python Flask website was launched finally. However I could not stay with this service for long and came back to PA.
Almost everything you will ever need to reliably host your Python website on PythonAnywhere is available on just a few pages. There is no control panel. You will find all the required links on the top right side of the dashboard page.
That said, the user interface of PythonAnywhere is not something you will feel excited about. Its plain and basic, not something that will ‘wow’ you. Mostly, it will get unnoticed. But like the user interface of some of its competitors, PythonAnywhere’s UI does not confuse you and it is not an attention seeker.
If you want to build a new webapp, there is a big button to get started.
If you want to upload a new file, there is an upload button, placed right in front of your eyes.
If you have made changes in your code and want to reload the server, there is a button for it, displayed very prominently.
If you want to create a database or launch a console there are well-positioned links for each, prominent enough not to be missed even by a cursory glance, not hidden deep inside multi-stage drop-downs which only the champions of treasure hunt can find.
Overall you get a few thoughtfully selected controls which are all you need to host your Python website to success.
At this point, you already know that a fully configured python environment gets created for every new Python web application within minutes on PythonAnywhere. Hence there is no need to install python, flask or any other web framework.
However to build a meaningful web application you will need to use few more Python modules. For example, for a Flask app, you might need to use libraries to create a user system (login, logout), manage forms, easily use database, integrate payment system, build mailing system, protect the app against attacks and so on.
The use of these libraries depends on the design of your web app. No selection fits all. Hence it is wise not to pre-install them in the environment. Rather, give users an easy way to install whichever package they think is applicable for their website. This is exactly what PythonAnywhere does. However PythonAnywhere has also included some of the most widely used libraries in their default environment. You can find the list of these libraries here.
“Ok cool, but how to install modules on PythonAnywhere?”
PythonAnywhere allows its users to install any number of Python modules they consider fit for their web application using “pip install” command in bash console. This whole system is kind of Lego blocks system. Select and add whichever block is good for your application with a single line of command.
This way you can create a light weight and useful stack of libraries which supports everything that your website needs.
As I started improving my websites, I enrolled into the Build A SaaS App With Flask course. For all improvements, I just kept installing required Python modules on my PythonAnywhere environment. It always worked.
A word of caution, there is a limit to what packages PythonAnywhere supports. For example, Celery, a task queue implementation for Python web applications is not supported. There are few other packages which are not supported. However I have found PythonAnywhere team resourceful enough to suggest an alternative package if your application needs something which is not yet supported by them.
On the plus side, PythonAnywhere as a product is in continuous improvement mode. This means what is not possible today, might be possible tomorrow. For example, Elasticsearch, a popular open-source full-text search engine, which was previously not supported at PythonAnywhere, is currently in private beta and might be available soon.
In case there is a Python module which is critical for the success of your application, the best way to move forward is to ask the PythonAnywhere support team about it over an email.
Now, to build a website you need technologies for front-tend, database and back-end. Combination of all such technologies is called ‘full stack’. You can easily build a full stack application on PythonAnywhere:
All together in one platform and ready to-be used. Thus you can build a static website, web app, chat bot, an API, blog or almost anything you want without the need of any extra service.
On PythonAnywhere’s homepage the first thing you read is “Host, run, and code Python in the cloud!”. Let’s examine this “cloud hosting” part.
The traditional way to Python programming is to create a development environment in a local computer. Many Python IDEs are available for this purpose. However the code remains in the local machine. Not a problem until:
With PythonAnywhere, you get a Python environment and a space to save all codes on cloud. This means:
Having used PythonAnywhere for quite a while now, I have really benefited from its cloud hosting features. This is not to say that it is a unique system. You can of course create a similar system using a few independent services, but having everything done-for-you within a nice package is a great luxury.
In case you need to share the code with a team member, you can quickly do it by generating a share link.
It is quite easy to upload files or update code. Here are a few simple ways:
PythonAnywhere offers the option to use version control systems for your code. This means that you can use GitHub or Bitbucket to push the code and then pull it to your PA account. Though it is not a unique feature but its helpful to know the version control systems can be used with PythonAnywhere.
PythonAnywhere also offers SFTP and Rsync options, but I have never used them. However you can read about all these methods here.
HTTPS is no longer a luxury but a necessity. No one trusts HTTP websites anymore. It’s been more than 18 months since Google Chrome started to flag all HTTP sites as not secure.
Now, the usual way to enable HTTPS on a website is to buy a SSL certificate for it. You can find a lot of companies selling SSL certificates. This is not a one time buy but a recurring cost on your business. However the great folks at Let’s Encrypt are on a mission to offer these certificates for free! You can get a certificate with 90 days validity, after which you can renew it.
PythonAnywhere has integrated Let’s Encrypt SSL certificate within its service. Initially it required manual work at the user’s end to set up this certificate along with a scheduled task to renew it every 30 days. However PythonAnywhere has now eaten away all the complexities and provides a simple toggle button to enable the HTTPS for the websites it hosts.
Alright, you have built a fully functional website and is now ready to launch. However there is something more you have to do…that is deciding key tasks which needs to performed either periodically or continuously.
What are these tasks? Here are a few examples:
And so on.
PythonAnywhere provides a simple interface to schedule periodic as well as continuous running tasks.
When I was learning and building my first Python Flask web app, I used to go through tutorials and Stack Overflow a lot. In case you too are doing this, you might come across terms like nginx, uwsgi and gunicorn. Nginx is a web server while uwsgi is a deployment type. Details of these are outside the scope of this review. However, you should know that PythonAnywhere uses uWSGI with Nginx to run all web apps hosted with it.
A good place to save environment variable is the wsgi configuration file available under the Web tab.
What is the downside? PythonAnywhere is not a Virtual Private Server (VPS) offering. What if your application need full server control or it is tricky enough to need something more than Python programming language, like Php or Ruby in backend? Personally I have no experience in building such systems. Great many web businesses are built solely on one technology and Python is an extremely scalable programming language. But if your business really need control of server, then PA is not something for you. You need a full-blown VPS.
The question you need to answer here is, “will my business really benefit from investing time, energy and resources to gain full server control?”. If the answer is a ‘No’, then PythonAnywhere will make your life extremely easy.
However if the answer is a “Yes”, PythonAnywhere is not for you. VPS is something you would like go ahead with. In this case, first make sure that either you or a team member is an expert in romancing with the server.
My website is up 100% of the time, except for around 15–20 minutes a month of scheduled maintenance duration. In these three years, I surprisingly never had an issue with uptime otherwise. I am using PA for an ecommerce store, SaaS apps, blogs and a few funnels.
PythonAnywhere periodically carries out around 15–20 minutes of maintenance, around once a month. During this period, all hosted websites remain inaccessible. It is not a big pain in return of otherwise smooth performance. But ‘down for scheduled maintenance’ is an old web issue. With continuous deployment, we no longer see websites down for maintenance. Though I am no expert in such systems, I still think PA team can find ways to do away with these down times.
In a Reddit discussion, a user shared his not-so-satisfactory experience running high CPU usage scripts. An experience which PythonAnywhere founder validated in a comment within the same thread. My guess is these were probably extremely high data crunching scripts, something which PythonAnywhere is not really built for as mentioned by its founder there.
An interesting thing to note is that this user did not advocate any other hosting service. He shifted to running his own servers, which is not something everyone can afford or has technical expertise to do. Also keep in mind that this is more than a four years old post, which means PythonAnywhere as a product has since improved a lot. But the fact is, I’m in no position to comment anything on the current performance of PA while running such high CPU usage scripts.
PythonAnywhere is hosted on AWS and built for scale. They have built a Python specific, easy to use system on top of AWS.
"So if they are built on AWS, then why should I not use AWS too?"
You get to see a basic traffic metrics in your PythonAnywhere dashboard.
I have sent over 100 emails to PythonAnywhere in last 3 years, a lot of them asking technical questions. Almost all of them get replied to within a day by support team. There are no support tickets, no automated replies and no delays. Just useful product communication between two people. I suspect that they take around a day to reply mainly due to difference in my and their time zones. Few mails that I had sent within their working hours even got replied to in few hours. Not system generated replies, but hand-typed replies by real humans!
Overall support team at PythonAnywhere is a rockstar!
You also get timely emails and tweets for scheduled down times for maintenance.
The simple interface which help users to peacefully build their Python web app and is considered as advantage of PythonAnywhere, makes the help pages dull and non-navigable. These pages are directly from the pre-CSS 1998 era.
This is not to say that the content in help pages is not helpful. In fact content is to the point, fairly useful and rank in google search. But I would like to see more lively, less intimidating and easily searchable help pages.
Forums are the PythonAnywhere’s most legit community. PA team promptly answers all questions on their forums. This has resulted in a very useful resource. These pages are linked to Github and you may find some user generated content too. But PA still lacks high engagement vibes in its forums.
By now you know that you can host a Python website on PythonAnywhere, access and run code from anywhere and get amazing support. What you do not know yet is that you can do it all for FREE.
Yes. PythonAnywhere offer free Python hosting. You can host Python website for free. Here is what you get under free plan:
All parameters are self-explanatory except Web Workers and CPU Seconds.
"A web worker is a worker process which serves responses to incoming requests. All the incoming requests are put into a queue and the worker processes operate by checking the queue, pulling off the request at the start, processing it, returning the response, then going back to checking the queue. Any requests that come in when all workers are busy are put into a queue. So if your code takes 0.2 seconds to handle each request, then a worker can handle 5 requests per second; that means with two workers you can handle ten requests a second. If your code is faster and can handle a request in 0.1 seconds, then each worker can handle ten requests/second, a total of 20 requests/second across both workers, and so on” said PA team in response to a few of my emails.
In short, a web worker is a process which serves the incoming requests. A visitor to your website makes a request when she type in a URL in a browser, click on a link, submit a form and so on. Faster these request gets served, faster will be your website’s speed. However website speed is a combination of code quality and web worker both. Increasing web workers will help if all web workers are working in their full capacity but still a lot of requests are in queue. If there are no pending requests in the queue still your website is taking too long to respond to the current requests than there could be the performance issue with you code.
A help page on PythonAnywhere describes CPU seconds:
"With every PythonAnywhere account, you get a number of CPU-seconds included each day. This applies to all code run through our in-browser consoles, and in your scheduled tasks. It does not currently apply to your web apps. A CPU-second is one second of full-power usage on a server-grade CPU. Your code only uses up CPU seconds while it’s actually busy. If your code isn’t using any CPU power (maybe it’s not running, or it’s waiting for input or for a web request to return) then it’s not using any CPU seconds. If you use up all of your included CPU seconds, don’t worry! You can always buy more — and even if you don’t, your processes will still run, in the tarpit. Tarpitted processes run at a lower priority than users who haven’t hit their limit yet, but they get any spare capacity that we have on our server cluster, unless they’re using gigabytes of RAM.”
This means CPU seconds do not affect the way web apps are run.
This means that you can:
and have pretty darn good performance too.
Other than free Python hosting, there are useful paid plans available too.
PythonAnywhere’s paid plans start at $5/month. At this price you get to have your own custom domain i.e. yourdomain.com. Considering the benefits they offer, this is pretty cheap for Python website hosting. For small web applications python developers will find free or starter plan enough to begin with.
The plans are quite scale-able. As your needs grow, you can customize each of the parameters. This means that once you have hosted a website with PythonAnywhere, you do not have to worry about the hosting when the website traffic grows. Their custom plan ensures that all the requirements are served.
PA team has built a great product and has a huge customer base. They seems to be a very small team (probably less than 10 people) and have achieved great feat. This observation becomes very clear when you compare their team size with some of their competitors. Most of PA’s competitors has team size running in hundreds.
It seems to me that ‘building great product’, ‘being attentive to customers’ needs’, ‘profitability’ and ‘eating all complexities to provide users a simple solution’ are key attributes to their DNA.
Much of their growth is organic. They get talked about in tech communities, books and forums. Happy users tweet about them all the time.
PythonAnywhere is hosted on AWS. In compliance with GDPR, they have built an EU-hosted system. A simple traffic analysis shows that PythonAnywhere is preferred for Python web hosting in USA, India, Brazil, UK and EU.
I have not come across any of their ads, either on Google or any social network. Neither could I find events or conference organised by them. However they are ranking pretty good for keywords and have done reasonably well in SEO. I suspect that this is a by-product of building good content and not a part of growth strategy.
For a product like this, which delights high percentage of users, a more aggressive focus on building community and engagement can lead to better growth.
When compared to their nearest competitors, it is very hard to find any kind of marketing activities. Which in a way is the testimony of high product quality. Product led growth is good but at some point of time, a company needs to push on the gas.
With that said, it is also very difficult to understand the insights behind these non-existent growth activities from outside. Maybe an all-techie team does not want to get into high decibel marketing or maybe they would like to remain hugely profitable with small team, without outside funding and do not want to spend money like VC funded companies. Difficult to say.
Also, this is not a review of their growth strategies, so I will not go into the details like I have done it for Zoom’s Growth Strategies.
PythonAnywhere is a good hosting service for Python websites. You should select PythonAnywhere for to host your websites if you are:
I am using PythonAnywhere for hosting multiple websites and have no intentions to shift to any other service. My personal highly satisfactory experience with their service can possibly make my opinion biased. Though I have tried my best for a balanced review, I might have got carried away by some of their awesomeness.
But the ease of use of the product, super prompt support and a product which just works, can not be talked highly enough. If you were searching “Why to use PythonAnywhere”, you must have got your answer by now. As far as ‘ease of use’ is concerned, PythonAnywhere is one of the best web hosting services for Python web applications.
If this review has provoked questions, inspired ideas or you have used PythonAnywhere and have your own thoughts to add, feel free to share in the comments.
I'm a SaaS growth consultant. I help SaaS businesses grow using organic growth strategies.
If you want to see how I can help you grow your SaaS business, schedule a free strategy call with me.
Connect with me on social.
Enter your email for high quality, actionable growth strategies delivered right at your inbox.