System update on 21 November 2019

This morning’s system update went smoothly; some websites did take a bit longer than we expected to start up afterwards, but all is well now.

There are two big new features that we have introduced which are going through some final post-deploy tests before they go live – a new system image (called fishnchips) to support Python 3.8 and to add on a number of extra OS packages that people have been asking us for, and an update to our virtualization system that will fix a number of problems with specific programs. We’ll be posting more about those when they’re ready to go live. [Update: we’ve posted about the fishnchips system image here.]

But there were a number of other things we added:

  • We’ve added the ability to restart an always-on task without stopping it, waiting for it to stop, and then starting it again – there’s a new “restart” button on the far right of the tasks table.
  • You can now temporarily disable a website without deleting it – the button is near the bottom of the “Web” page.
  • And, of course, the normal set of minor tweaks, bugfixes, and the like.

Happy coding!

EU migrations are now live!

In brief: if you have an account on you can have it migrated to – just let us know via email to

If you’d like to know more about what that means, read on…

Read more…

Our new CPU API

We received many requests from PythonAnywhere users to make it possible to programmatically monitor usage of CPU credit, so we decided to add a new endpoint to our experimental API.

Read more…

Using our file API

Our API supports lots of common PythonAnywhere operations, like creating and managing consoles, scheduled and always-on tasks, and websites. We recently added support for reading/writing files; this blog post gives a brief overview of how you can use it to do that.

Read more…

System update on 26 June

Our system update on 26 June went pretty smoothly :-) There were a number of useful changes:

  • Our API now supports uploading, downloading and listing files in your private file storage. There is another blog post about this.
  • We now have an official system in place to migrate your MySQL data between database servers, which means that if you’re on an older version, we can move you over to 5.7. Let us know if you’re interested!
  • Our system for migrating user accounts from our US-based system at to our EU-based one at is almost finished – just a few final bugs to work out. We’ll post about this again when it’s ready to go live. Update: it’s now live.

We also pushed a number of bugfixes:

  • A number of issues which meant that always-on tasks could lose access to the network have been fixed.
  • Previously, if you tried to change the command for an always-on task that was disabled, you’d get an error – this has been addressed.
  • Some HTTP libraries (which seem particularly common on IoT devices) put the port number in the host header on requests (eg. they send rather than This is perfectly valid HTTP, albeit uncommon, but our system failed to parse them correctly and would respond with a 404 error. We’ve fixed that.

There were also a whole bunch of minor UI tweaks and the like.

Right now we’re working on making sure that our billing system supports the Strong Customer Authentication (SCA) regulations that will come into force for all payments from European credit/debit cards this September; hopefully we can make this as seamless as possible for you.

Happy coding!

Using MongoDB on PythonAnywhere with MongoDB Atlas

This requires a paid PythonAnywhere account

Lots of people want to use MongoDB with PythonAnywhere; we don’t have support for it built in to the system, but it’s actually pretty easy to use with a database provided by MongoDB Atlas – and as Atlas is a cloud service provided by Mongo’s creators, it’s probably a good option anyway :-)

If you’re experienced with MongoDB and Atlas, then our help page has all of the details you need for connecting to them from our systems.

But if you’d just like to dip your toe in the water and find out what all of this MongoDB stuff is about, this blog post explains step-by-step how to get started so that you can try it out.

Read more…

System update this morning

This morning’s system update went smoothly :-)

It was primarily a maintenance update, bringing our US-based system up to the same version as our EU-based system. There were a number of minor bugfixes, along with a bunch of improvements to our system administration tools, which won’t be visible to you, but do mean that we’ll be able to spend less time on admin stuff – which gives us more time to work on adding cool new features!


We’re proud to announce today that we now have an EU-hosted PythonAnywhere system :-) You can access it at It’s completely separated from our normal system, but has all of the same features – plus billing in euros.

Read more…

How DNS works: a beginner's guide

The blog post below has now been “promoted” to being an official help page – you can read the most current version here. The version below is the original published version and may be out of date.

We sometimes get emails from people who are trying to point their custom domain at PythonAnywhere so that they can host their website, but are struggling to set up their DNS settings. Normally DNS setup is pretty simple, but sometimes people can get bogged down due to confusing interfaces on their registrar’s site, or complexities in the terminology people use.

The parts of DNS that you need to know about in order to host a website are actually not all that complicated, but some domain registrars have complicated, hard-to-understand interfaces. Either they assume that you understand all of the technical details about how the whole thing works – which makes it hard for first-timers – or they try to put a simple user-friendly interface on top of it, but simplify it so much that it’s actually harder to use because they’re hiding important stuff from you.

Given that basic DNS stuff really isn’t all that hard, we felt that it would be a good idea to post an explanation, going from the basics up to some slightly deeper stuff. This post is written so that if you only want the basics, you can just read the first part, while if you want a deeper understanding – either out of interest, or because your domain registrar has got such a low-level interface that you need to – then you can keep reading.

It’s worth noting that for most people, you don’t need to know any of this stuff to set up a website on PythonAnywhere, even with a custom domain; it’s meant more as an explanation so that people who do run into problems with their registrar have the background knowledge they need to solve the problem – or, indeed, to explain to the registrar’s tech support team what the problem is. And, of course, it’s a bit of light reading for people who are just interested in this stuff :-)

Read more…

Slow scheduled tasks after yesterday's system update

After our system update yesterday, there was a period when some people’s scheduled tasks were running slowly. This is an update on what caused the issue and what we did to fix it.

Read more…