In-Depth Review: Should you host Python websites on PythonAnywhere?

Ankur Tiwari
Thoughtlytics
Published in
21 min readJan 20, 2020

--

Is PythonAnywhere good enough to host your Python web app?

This post was originally published here.

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 the 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 the Lean Development Methodology to 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 make up my mind. But since I wanted to get started, I chose and signed up for PythonAnywhere.

Even after significant research about Python website hosting services, 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 seven years old company based in London.

I’m reviewing PythonAnywhere for following reasons:

  1. I’ve been its user for three years.
  2. When I started developing Python Flask web apps, I had to spend many days searching “Hosting services for Python website.” When I finally selected a service, I went in with a leap-of-faith, in-spite of all the research.
  3. Many people keep asking in forums, “where should I host my Python website and Python applications.”
  4. A wrong decision in hosting a Python app can cost dearly in time, performance, project growth, and energy.
  5. The Internet’s signal-to-noise ratio is going down every day. If I can help put even one thing in perspective, it will be a success.

The goal here is to simplify and present enough information so that you can make a well-informed decision instead of relying on a 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.

What can you do on PythonAnywhere?

  1. Code, run and host python apps and scripts
  2. Build & host Django web applications
  3. Build & host Flask web applications
  4. Build & host web2py web applications
  5. Build & host Bottle web applications

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:

  • Write code for Python applications in a web-based editor [or in a console],
  • Save and run the code, validate its output,
  • Host the code on PythonAnywhere.

What are PythonAnywhere’s big promises?

  1. Start hosting quickly
  2. Develop anywhere
  3. Amazing support

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.

  1. Getting Started: How easily can you experience a product’s value?
  2. User Interface: Can you use the core functions of the product without the need to visit “how-to” pages and YouTube?
  3. Platform & Tech: Does the product support your requirements with the least friction?
  4. Performance: Is it reliable to host a Python website on PythonAnywhere?
  5. Support: Do your tickets get resolved, or all you receive are scripted replies?
  6. Knowledge Base & Community: Can you get help, ideas, and inspiration instantly?
  7. Pricing: Low or high, are you getting value for money?
  8. Is it built for you?

Getting Started

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 the best decision. Once you have chosen a service, you want to complete the signup process and validate your choice quickly.

Hence, You want to move from a stage of confusion to a stage of achievement. Fast.

User’s journey to value discovery:

1. Confusion: How can I solve my problem?

2. Search: What are my options?

3. Decision: Ok! this one.

4. Action: Signed up.

5. Anticipation: Is it what I thought it to be?

6. Achievement: Oh Wow!

All you want is to quickly and reliably move from step 1 to 6.

PythonAnywhere does a great job of helping its users on this journey. It takes them from a stage of confusion to a stage of achievement in just nine clicks within a few minutes. Yes, nine clicks to have your working Python website shinning on the Internet!

Signup and launch your first Flask web app, all in just nine clicks

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 the Internet.

I once used a popular hosting service to host a simple Flask web app. It took me four days to reach this stage. I 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 the 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.

PythonAnywhere delivers on its promise of “Start Hosting Quickly.”

Rating: A+

User Interface

I thought nothing of PythonAnywhere’s user interface at the beginning. It did not attract 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 the user interface.

Every flow and control that I needed to run my Flask website was there 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 & effort, I finally launched my Python Flask website. 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.

All the controls are available with these few links on the top right corner

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.

A simple and minimal interface that does not come in the way of successfully hosting a Python website.

Rating: B

Platform & Tech

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 a 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, quickly use a database, integrate a payment system, build a 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. Instead, give users an easy way to install whichever package they think is applicable for their website. This is precisely 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 do I install modules on PythonAnywhere?”

PythonAnywhere allows its users to install any number of Python modules they consider fit for their web application using the “pip install” command in the bash console. This whole system is a kind of Lego blocks system. Select and add whichever block is suitable for your application with a single line of command.

This way, you can create a lightweight and useful stack of libraries that supports everything that your website needs.

Pip install any package you need and improve your environment block by block

As I started improving my websites, I found it super easy to add new features and expand their capabilities. 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 yet 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 that 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-end, database, and backend. A combination of all such technologies is called ‘full-stack.’ You can easily build a full-stack application on PythonAnywhere:

  • Backend: Python Web Framework (Django, Flask, etc.)
  • Database: MySql or Postgress
  • Front-end: HTML, CSS, Javascript (or any JS library)

All together in one platform and ready to be used. Thus you can build a static website, web app, chatbot, an API, blog, or almost anything you want without the need for 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 on a local computer. Many Python IDEs are available for this purpose. However, the code remains in the local machine. Not a problem until:

  1. Your machine crashes
  2. You need to access the code from another machine
  3. You completed the project and attempted to deploy it on a live web server only to find that settings required to run a code in the local machine are different than the ones to run it on the live server. Another day or two needed on this now.

With PythonAnywhere, you get a Python environment and a space to save all codes on the cloud. This means:

  1. You can get access to the code from anywhere by simply login to your PythonAnywhere hosting account. You do not just get the cloud space but, more importantly, the ability to run and execute Python codes within the environment you have built, from any machine, any location. So you can continue the development independent of device or location.
  2. You are building on a real environment from day one. So the moment you would like to launch the website for the world, there will be no extra work, configuration, or surprises.

Having used PythonAnywhere for quite a while now, I have 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.

Click on the Share button in the text editor to generate a share link

It is quite easy to upload files or update code. Here are a few simple ways:

  • Open the file to be updated, update the code in it and click Save, or
  • Directly upload the updated file in the directory, or
  • Upload a zip file in case of multiple files and then unzip it from the bash console.

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 an 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.

One-click HTTPS support courtesy Let’s Encrypt

Now you can enable HTTPS for your Python website hosted on PythonAnywhere with just one click and that too for free!!

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 critical tasks that need to performed either periodically or continuously.

What are these tasks? Here are a few examples:

  1. Automatically send your team a daily report of new user registrations, day’s sales, new leads, etc.
  2. Send abandon cart emails to users.
  3. Take a daily backup of the database and save it in separate cloud storage.
  4. Send birthday or anniversary emails to your users.

And so on.

PythonAnywhere provides a simple interface to schedule periodic as well as continuous running tasks.

Schedule periodically running tasks on PythonAnywhere
Schedule continuous running tasks on PythonAnywhere

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.

An excellent place to save the 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 needs full server control, or it is tricky enough to need something more than Python programming language, like Php or Ruby in backend? I have no experience in building such systems. Great many web businesses are made solely on one technology, and Python is an extremely scalable programming language. But if your business needs control of the 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 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 to go ahead with. In this case, first, make sure that either you or a team member is an expert in romancing with the server.

PythonAnywhere delivers on its promise of “Develop Anywhere.”

Rating: A

Performance

My websites are 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 any 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 significant pain in return for 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 the PA team can find ways to do away with these downtimes.

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 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 servers, which is not something everyone can afford or has the 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 can:

  • If you have the technical expertise to do so, and
  • Your business benefits from this added complexity

You get to see basic traffic metrics in your PythonAnywhere dashboard.

PythonAnywhere dashboard shows basic traffic metrics for your website

“PythonAnywhere is very well optimized for its targeted application, which is hosting Python websites.”

Rating: A

Customer Support

I have sent over 100 emails to PythonAnywhere in the last three years, a lot of them asking technical questions. Almost all of them get replied to within a day by the 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 differences in my and their time zones. Few emails that I had sent within their working hours even got answered to in a few hours. Not system-generated replies, but hand-typed responses by real humans!

Overall support team at PythonAnywhere is a rockstar!

You also get timely emails and tweets for scheduled downtimes for maintenance.

PythonAnywhere sends emails and tweets for downtime notifications

PythonAnywhere delivers on its promise of “Amazing Support.”

Rating: A+

Help Pages & Community

The simple interface which helps users to build their Python web app peacefully and is an 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. 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 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.

“Good content, dull design, not a well-engaged community.”

Rating: B

Update [11-Aug-2020]: I have noticed that since the publication of this review, folks at Pythonanywhere have improved the UI of their blog pages.

Plans & Pricing

By now, you know that you can host a Python website on PythonAnywhere, access and run code from anywhere and get fantastic support. What you do not know yet is that you can do it all for FREE.

Yes. PythonAnywhere offers free Python hosting. You can host a Python website for free. Here is what you get under the free plan:

  1. A free domain: yoursubdomain.pythonanywhere.com [sub-domain]
  2. Web workers: 1
  3. CPU Seconds: 100
  4. Consoles: 2
  5. Scheduled Tasks: 1
  6. Always on tasks: 0
  7. File Storage: 500 MB of disk space

All parameters are self-explanatory except Web Workers and CPU Seconds.

“A web worker is a worker process that 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 five 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 that serves the incoming requests. A visitor to your website makes a request when she types 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 the 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 your code.

A help page on PythonAnywhere describes CPU seconds:

“With every PythonAnywhere account, you get several 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 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:

  • Host Django website for free
  • Host Flask website for free
  • Host website or web app built on any Python framework for free

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 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.

PythonAnywhere has paid plans starting at $5. Custom plans are suitable for a variety of requirements.

“PythonAnywhere has an attractive free plan as well as custom paid plans for all kinds of requirements. As you scale, you can simply change the required settings.”

Rating: A

Growth & Marketing

PA team has built a great product and has a vast customer base. They seem to be a small team (probably less than 10 people) and have achieved a great feat. This observation becomes very clear when you compare their team size with some of their competitors. Most of PA’s competitors have team size running in hundreds.

It seems to me that ‘building a 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 its 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. Simple traffic analysis shows that PythonAnywhere is preferred for Python web hosting in the USA, India, Brazil, UK, and the EU.

Traffic by countries — PythonAnywhere

I have not come across any of their ads, either on Google or any social network. Neither could I find events or conferences organized 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 the growth strategy.

PythonAnywhere is ranking good on organic keywords

For a product like this, which delights a 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 tough to find any kind of marketing activity, which in a way, is the testimony of high product quality. Product led growth is good, but at some point in time, a company needs to push on the gas.

With that said, it is also tough 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 perhaps they would like to remain hugely profitable with a 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 has had great growth but can be more pro-active in their engagement with the community.”

Rating: C

Is it built for you?

PythonAnywhere is an excellent hosting service for Python websites. You should select PythonAnywhere for to host your websites if you are:

  • A startup developing its apps using Python programming language
  • A team of web developers or data systems within a company and want to run apps for specific purposes
  • An independent developer and wants to run Python scripts or websites
  • A growth team within a company who is looking at building tools for growth, capture data and run experiments for growth
  • A Python teacher and want to user PA with students
  • Someone learning Python primarily for web development

Conclusion

I am using PythonAnywhere for hosting multiple websites and have no intention to shift to any other service. My personal highly satisfactory experience with their service can 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.

You can signup for PythonAnywhere here.

Two truths about SaaS growth Strategies

  1. A growth strategy is as good as the insights it is based on.
  2. A bad strategy takes almost the same effort to execute as it takes for a good strategy

To discover the most compelling growth insights for your SaaS business, analyze the data like website traffic, new signups, free user activation, and paid plan-wise customers. Even if you are a new business, you can still discover impactful growth insights from just a few months of data.

Use the SaaS Growth Growth Model — a spreadsheet-based model that analyzes the data using more than eight different analyses, discovers hidden growth levers, and suggests top growth strategies for your business.

Get it here : SaaS Growth Strategy Model

If you are a founder, CMO, or someone related to the growth of a SaaS business, you will get a lot of value by subscribing to the Organic SaaS Growth newsletter.

--

--

Ankur Tiwari
Thoughtlytics

I help SaaS companies with organic growth @thoughtlyticsHQ, www.thoughtlytics.com