Borislav Hadzhiev
Wed Apr 20 2022·2 min read
Photo by Marcelo Novais
The Python "AttributeError module 'requests' has no attribute 'post'" occurs
when we have a local file named requests.py
and try to import from the
requests
module. To solve the error, make sure to rename any local files named
requests.py
.
Here is an example of how the error occurs in a file called requests.py
.
import requests def make_request(): # ⛔️ AttributeError: module 'requests' has no attribute 'post' res = requests.post( 'https://reqres.in/api/users', data={'name': 'John Smith', 'job': 'manager'} ) print(res.json()) make_request()
The most likely cause of the error is having a local file named requests.py
which shadows the official requests
module.
Make sure to rename your local file to something other than requests.py
to
solve the error.
import requests def make_request(): res = requests.post( 'https://reqres.in/api/users', data={'name': 'John Smith', 'job': 'manager'} ) print(res.json()) # ✅ Works make_request()
Another thing to look out for is having an incorrect import statement. If you do
import requests
, then access the post
method as requests.post(...)
.
The Python interpreter first looks for the imported module in the built-in modules, then in the current directory, then in the PYTHON PATH, then in the installation-dependent default directory.
You can access the __file__
property on the imported module to see whether it
is shadowed by a local file.
import requests print(requests.__file__) # ⛔️ result if shadowed by local file # /home/borislav/Desktop/bobbyhadz_python/requests.py # ✅ result if pulling in correct module # /home/borislav/Desktop/bobbyhadz_python/venv/lib/python3.10/site-packages/requests/__init__.py
A good way to start debugging is to print(dir(your_module))
and see what
attributes the imported module has.
Here is what printing the attributes of the requests
module looks like when I
have a file requests.py
in the same directory.
import requests # ['__builtins__', '__cached__', '__doc__', '__file__', # '__loader__', '__name__', '__package__', '__spec__'] print(dir(requests))
If you pass a module object to the dir() function, it returns a list of names of the module's attributes.
We can see that the imported requests
module doesn't have the post
attribute, which makes it evident that we are shadowing the official requests
module with our local requests.py
file.
If you try to import the requests
module in a file called requests.py
, you
would get a little different error message that means the same thing.
import requests def make_request(): # ⛔️ AttributeError: partially initialized module 'requests' has no attribute 'post' (most likely due to a circular import) res = requests.post( 'https://reqres.in/api/users', data={'name': 'John Smith', 'job': 'manager'} ) print(res.json()) make_request()
Renaming your file solves the error.