Serve Django project on local WiFi Network - python

I used
python manage runserver 0.0.0.0:8000
to start the server so that I can access the project from other computers on my wifi network, but when i browse to internet-ipaddress:8000 on an another computer, the project doesn't load. Am I missing a setting?

Assuming all the machines can see eachother ...
get the IP address of the machine you are running runserver on. For example run ifconfig at the console.
ifconfig
eth0 Link encap:Ethernet HWaddr 10:1e:72:b8:2a:4b
inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
...
check if you are running a firewall. For example
sudo ufw status
if active, you need to open port 8000 so, again at the console, run
sudo ufw allow 8000/tcp
then start the runserver (or runserver_plus if using django-extensions)
python manage.py runserver_plus 192.168.1.2:8000
open a browser on another machine
http://192.168.1.2:8000/admin

What do you mean by internet-ipaddress? That sounds like you're using the external IP of your router. You should be using the IP of the particular machine you're serving from, which will be an internal address like 192.168.0.2.

You should bind it to your local IP address. For example
python manage.py runserver 192.168.1.100:8000

You should check out solutions like Pagekite or Show Off as they're generally trivially easy to set up and offer a great deal of flexibility (and mobility) and provide a stable domain name to your localhost server.

Note: 192.168.2.5 is my ip. So, give your own
Open settings.py and add this to ALLOWED_HOSTS
ALLOWED_HOSTS = ['192.168.2.5']
Then run command
python manage.py runserver 192.168.2.5:8000
Allow access in the firewall's warning appeared.
Now access your host from the systems on same network.

add 192.168.0.8 (or whatever your router ip is) as a string to ALLOWED_HOSTS list in settings then run server using python manage.py runserver 192.168.0.8:8000

Related

Django development server on LAN

It's my first time creating a django project. Now I'm at the point where I need to run the development server in the LAN. Except I can't get it to work.
My computer is connected with ethernet and the other computers in the network are connected via Wifi don''t know if that's relevant though.
What I tried by running the following:
The ip adress I found using ifconfig and copying inet addr: under ens33.
- python manage.py runserver myipadrres:8000
- python manage,py runserver 0.0.0.0:8000
The 0.0.0.0 doesn't even work on the windows os on my own computer. The ipadress does work for that.
Django settings debug is set to True.
Like I said it's the first time creating such a project and I don't know much about web related stuff. So I might have forgot to install something that I don''t know about.
Thanks in advance for your help
EDIT:
Managed to get it working i just had to turn on bridged networking in my VM settings
Greetings,
Dani
If that setup is working on your localmachine then
Just use that localmachine Ip:port-number in your LAN pc as:
for example :
If local machine Ip = 192.168.6.25 and setup is running on 8000 port ,then open browser at LAN machine PC and use this:
192.168.6.25:8000
Even you can run the setup on different port by this command
./manage.py runserver 0.0.0.0:<your_port>

django run localhost from another computer connected to another network

I am running my django project in localhost and it works fine..
For test purpose I want to run my localhost from another computer connected in the same network.
I have done python manage.py runserver 'my ip address'
That works fine too.. Is there any way that I can access my localhost from another computer connected to another network?
Like I am connected to A network and running my localhost and my friend is connected to B network. Suppose he wants to access my localhost and see my project running then is it possible to access localhost of a computer from another computer connected to another project?
You can. Just run the django runserver in
python manage.py runserver 0.0.0.0:8000
Now you can access your app using youripaddress:8000
From Django ...
Note that the default IP address, 127.0.0.1, is not accessible from other machines on your network. To make your development server viewable to other machines on the network, use its own IP address (e.g. 192.168.2.1) or 0.0.0.0 or :: (with IPv6 enabled).
You can provide an IPv6 address surrounded by brackets (e.g. [200a::1]:8000). This will automatically enable IPv6 support.
Updated:
In order to match the answer to Title of the question. You need configure your router to forward port 80 to yourapp address
Run server with local host or your system IP like one of the below
python manage.py runserver 192.168.6.7:8000
python manage.py runserver 0.0.0.0:8000
python manage.py runserver 127.0.0.1:8000
add hosts in settings.py to access from other system in network.
ALLOWED_HOSTS = ['127.0.0.1', 'localhost','192.168.6.7']
If you're working DEBUG=True mod in your Django project, you shouldn't need anything other than that (I assume you are not using port 80, it requires root access).
You must use 0.0.0.0 as host IP, it is a simple solution. And the command is:
python manage.py runserver 0.0.0.0:8000. That's it.

Connect to python development django server from a non-local network machine

I am able to run my django dev server on my machine and make it accessible to the local network by running:
sudo python manage.py runserver IP:80
OR
sudo python manage.py runserver 0.0.0.0:8000
Now, how can I make my server accessible over the internet by a machine not in my local wifi network?
Use your machine LAN/WAN ip address, then configure your modem/router to let this ip have external access.
For example, considering your machine LAN/WAN ip address is 192.168.0.100.
You run your django development server as python manage.py runserver 192.168.0.100:8000.
An then, set up your modem/router.. Probably inside your DMZ settings.
You can use a tool like ngrok.
Here you can find a detailed usage description: http://www.lexev.org/en/2014/remote-url-localhost-server/

manage.py runserver

I am running python manage.py runserver from a machine A
when I am trying to check in machine B. The url I typed is http://A:8000/ .
I am getting an error like The system returned: (111) Connection refused
You can run it for machines in your network by
./manage.py runserver 0.0.0.0:8000
And than you will be able to reach you server from any machine in your network.
Just type on other machine in browser http://192.168.0.1:8000 where 192.168.0.1 is IP of you server... and it ready to go....
or in you case:
On machine A in command line ./manage.py runserver 0.0.0.0:8000
Than try in machine B in browser type http://A:8000
Make a sip of beer.
Source from django docs
You need to tell manage.py the local ip address and the port to bind to. Something like python manage.py runserver 192.168.23.12:8000. Then use that same ip and port from the other machine. You can read more about it here in the documentation.
I was struggling with the same problem and found one solution. I guess it can help you. when you run python manage.py runserver, it will take 127.0.0.1 as default ip address and 8000. 127.0.0.0 is the same as localhost which can be accessed locally. to access it from cross origin you need to run it on your system ip or 0.0.0.0. 0.0.0.0 can be accessed from any origin in the network.
for port number, you need to set inbound and outbound policy of your system if you want to use your own port number not the default one.
To do this you need to run server with command python manage.py runserver 0.0.0.0:<your port> as mentioned above
or, set a default ip and port in your python environment. For this see my answer on
django change default runserver port
Enjoy coding .....
Just in case any Windows users are having trouble, I thought I'd add my own experience. When running python manage.py runserver 0.0.0.0:8000, I could view urls using localhost:8000, but not my ip address 192.168.1.3:8000.
I ended up disabling ipv6 on my wireless adapter, and running ipconfig /renew. After this everything worked as expected.
in flask using flask.ext.script, you can do it like this:
python manage.py runserver -h 127.0.0.1 -p 8000
For people who are using CentOS7, In order to allow access to port 8000, you need to modify firewall rules in a new SSH connection:
sudo firewall-cmd --zone=public --permanent --add-port=8000/tcp
sudo firewall-cmd --reload
I had the same problem and here was my way to solve it:
First, You must know your IP address.
On my Windows PC, in the cmd windows i run ipconfig and select my IP V4 address. In my case 192.168.0.13
Second as mention above: runserver 192.168.0.13:8000
It worked for me.
The error i did to get the message was the use of the gateway address not my PC address.
First, change your directory:
cd your_project name
Then run:
python manage.py runserver
Ok just came across this post this is a little off topic but hopefully explains a few things, The IP 127.0.0.1 points to your network card so any traffic that you cause to go to that IP address will not leave your computer.
For example modern network cards in laptops for example will not even give you that IP if you are not connected to a wifi or cabled network so you'll need to be connected at least to activate the card.
If you need to run multiple servers on the same machine but want to access them with a domain then you have a couple of options
edit your computers host file to define the domain and what IP it goes to
use a DNS Alias I set up using a cname record years ago *.local.irishado.com will point to 127.0.0.1
so for example these three domains will point to your local machine
http://site1.local.irishado.com
http://site2.local.irishado.com
http://site3.local.irishado.com
will all point to your local machine then in python projects you will need to edit the projects setting file ALLOWED_HOSTS property to hold the domain it will accept
ALLOWED_HOSTS = ['site1.local.irishado.com']

How to make Django's devserver public ? Is it generally possible?

I'm currently trying out the Django framework and I would share/present/show some stuff I've made to my workmate/friends. I work in Ubuntu under Win7 via VMware. So my wish/desire is to send my current pub-IP with port (e.g http://123.123.123.123:8181/django-app/) to my friends so they could test it.
the Problem is - I use django's Dev server (python /path-to-django-app/manage.py runserver $IP:$PORT).
How do I make the devserver public?
EDIT:
Oh, there's something I forgot to mention. As I sad I use VMware with Ubuntu. I have a shellscript that returns me my current int-IP 192.168.xx.xx and saves it in a environment-variable ($CUR_IP)
So, each time I want to run django's devserver I simply execute
python /path-to-django-site/manage.py runserver $CUR_IP:8080
At this way I become an http-adress (e.g.http://192.168.40.145:8080/app-name/) which I CAN USE OUTSIDE my virtual machine. I could test it on my host (win7) machine. That's actually the reason why I asked the question. I thought there's a way to use the ext-IP and make runserver usable outside too
python manage.py runserver 0.0.0.0:8181
This will run development server that should listen on all IP's on port 8181.
Note that as of Jun 17, 2011 Django development server is threaded by default (ticket #1609).
From docs:
Note that the default IP address,
127.0.0.1, is not accessible from other machines on your network. To
make your development server viewable
to other machines on the network, use
its own IP address (e.g. 192.168.2.1)
or 0.0.0.0.
Assuming you have ruby installed, you just have to get localtunnel:
gem install localtunnel
then start your python development server with:
python manage.py runserver 0.0.0.0:8000
in another shell, start localtunnel:
localtunnel -k ~/.ssh/id_rsa.pub 8000
That will output an url to access your local server.
Port 8000 is now publicly accessible from http://xxxx.localtunnel.com
That's it.
192.168.*.* is a LAN-private address -- once you've done the proper VMWare (or other VM manager) and firewall incantations to make it accessible from the LAN, it still won't be accessible from outside the LAN, i.e., from the internet at large (a good thing too, because such development servers are not designed for security and scalability).
To make some port of a machine with a LAN-private IP visible to the internet at large, you need a router with a "virtual servers" ability (many routers, even cheap ones, offer it, but it's impossible to be specific about enabling it since each brand has its own idiosyncratic way). I would also recommend dyndns or other similar service to associate a stable DNS name to your always-varying public IP (unless you're splurging for a static IP from your connectivity provider, of course, but the latter option is becoming costlier all the time).
superuser.com or serverfault.com may provide better answers and details (once you give every single little detail of your configuration in a question) since the question has nothing much to do with software development and everything to do with server administration and configuration.
I had to add this line to settings.py in order to make it work (otherwise it shows an error when accessed from another computer)
ALLOWED_HOSTS = ['*']
then ran the server with:
python manage.py runserver 0.0.0.0:9595
Also, make sure that your firewall allows communication to the chosen port (9595 in this case)
Already answered but adding npm alternate of same localtunnel
sudo npm install -g localtunnel
lt --port 8000 --subdomain yash
If you are using Virtualbox, You need to change the network setting in VB from "NAT" to "Bridged Adaptor". Then restart the linux. Now if you run sudo ifconfig you are able to see your IP address like 192.168.*.* . The last step is runserver
python manage.py runserver 192.168.*.*:8000
Cheers!
You need to configure bridged networking in VMWare and also grant access to the target port in Ubuntu firewall.
Alternatively, you can use cotunnel, Just run cotunnel in your ubuntu (in VMware) change your tunnel port in cotunnel dashboard which port you are using in local side. It gives public url and you can share the url with your friends.
Your Django server can listen to 127.0.0.1 or 0.0.0.0 (I prefer 0.0.0.0) it does not matter for cotunnel.
Might I suggest trying something like pyngrok to programmatically manage an ngrok tunnel for you? Full disclosure, I am the developer of it. Django example here, but it's as easy as installing pyngrok:
pip install pyngrok
and using it:
from pyngrok import ngrok
# <NgrokTunnel: "http://<public_sub>.ngrok.io" -> "http://localhost:8000">
http_url = ngrok.connect(8000)
No messing with ports or firewalls or IP addresses, and now you can also inspect the traffic (which is useful since what you're doing here is ongoing development, not running a prod-ready server).

Categories