在我们运行了我们第一个Django项目后,我们怎么让本局域网的主机访问我们的网站呢?
准备工作!
Pycharm下:
点击文件—>创建项目(然后选择我们的虚拟环境
命令行下:
在我们想创建的路径下,打开CMD输入django-admin startproject [项目名]
在Pycharm中启动我们的项目:python manage.py runserver 0.0.0.0:99 (保证局域网主机能够访问到我们)
在命令行中 python manage.py runserver 0.0.0.0:99
第一次访问
我们可使用手机、虚拟机、电脑等等来进行第一次访问
这里我使用虚拟机来进行使用,在用虚拟机时,我们需要配置一些东西
(1) 将虚拟机的网络设置为NAT或桥接
(2) 用虚拟机来ping一下我们的真机来以此确保网络联通
当我们ping通了即可进入下一步了
在我们的浏览器中输入我们的IP地址及端口(IP:PORT)
(这里需要注意的是,如果是老版的IE需要我们输入http://ip:port 因为老版IE并没有自动添加http://这个功能
访问成功后
如图示例:
大家可能会可能会有些黑人问号 为什么我们在本主机访问的页面和我们在虚拟机的不一致
我们通过页面提示信息,不难猜出 ALLOWED_HOSTS 是在我们项目的settings.py文件下,那是为什么的。
可以看得到ALLOWED_HOSTS模式为空
ALLOWED_HOSTS就是允许被访问的主机,在ALLOWED_HOSTS变量中IP才能被访问,默认为127.0.0.1
也就是说,我们访问失败的原因就是出这,我们只需要在ALLOWED_HOSTS中添加允许访问的主机IP即可
需要注意的是,一旦我们对ALLOWED_HISTS添加了内容,我们的127.0.0.1也不能进行访问了(需要添加到ALLOWED_HOSTS中
访问成功
DEBUG模式
不知道大家有没有发现,当我们修改项目的代码时,项目会自动的对其进行更新!
这其实就是DEBUG模式下的一个特性
但是,大家有没有发现,一旦我们代码写错也会对应的报错
到我们开发的时候,对用户的体验不会很好(需要注意)
URL映射
在我们学习URL映射之前,我们可以先将URL想象成一个地图的一个地点,我们需要有url才能找到那个地方
小案例:
在我们项目的urls.py中添加
from django.http import *
def index(request):
return HttpResponse(‘首页’)
然后在我们的urls.py中添加路由记录
urlpatterns = [
…
path(’’,index)
…
]
运行:python manage.py runserver
在浏览器中输入127.0.0.1:8000 可以看到的我们的页面从Djnago的默认页面变成了首页(是不是有一点点神奇呢)
综上所述
我们可以看到的URL映射,我们的path映射到我们所定义index函数中,形成了URL—>视图(view)
但是我们这样做映射会不会有些麻烦呢,所以Django给我们了一个方法:
-我们可以用 python manage.py startapp [App名字]
我们可以将功能放在一个APP中来进行管理和维护
小案例
在我们创建App中,views中创建一个index和login来做一个映射
(一)打开我们的项目
(二)在项目的urls.py中添加: from [App名].views import *
(三)然后在App名下的views.py添加我们的视图函数:
def index(request) :
'''
创建APP,并添加两个视图函数
(一)打开我们的项目
(二)在项目的urls.py中导入我们视图包
(三)然后在APP目录下的views.py添加我们的视图函数
'''
from django.http import *#导入所需的包
def index(request):#request为默认值
return HttpResponse('首页')
def login(request):#登录页面
return HttpResponse('登录页面')
#视图的返回结果必须是django.https.response.HttpResponseBase对象或者子类的对象.
当我们建立好视图函数之后,我们不过有了视图,也就是说建好了一个地方,但是不知道怎么去
(二)做URL映射
在我们项目下的urlpatterns添加映射关系
urlpatterns = [
...
path('',index),#也就是说当我们输入IP:PORT为空的时候,访问的网站
#需要注意的是,一旦我们由了URL映射关系,Django自带的那个网页就会消失了
path('login',index)#当我们在浏览器导航条中输入IP:PORT加我们/login即可访问成功!
]
虽然是个简单的项目,但是大家想想,一个网站的信息很多,如果用这种映射方法会不会很麻烦呢,第二个知识点!
参数传递
在我们访问百度搜索信息时,可以看到的URL后的一大串字符,那是什么呢?
那些是我们访问一个页面所带的信息
而我们可不可以页怎么做呢
修改我们的login视图
def login(request):
Get = request.Get.get('username')
if Get:
return HttpResponse('欢迎! %s' %Get)
return HttpResponse('登录页面')
我们在导航条,输入127.0.0.1:8000/login/?username = abc
访问成功:
接下来我们来学习第二种参数传递方法
URL参数传递
有时候,url中包含了一些参数需要动态调整,比如简书的某篇文章的详情页的url,是http://www.baidu/p/,其中的id就是文章的id,那么如何在django中实现我们的需求,这时候就可以在我们的path函数中,用尖括号来定义一个参数
示例:
views.py下
def goods(request,commodity):
if commodity:
return HttpResponse('您已购买 %s' %commodity)
我们定义了一个goods的路由,需用户输入商品名字
urlpatterns = [
...
path('goods/<commodity>',goods)
...
]
当我们在导航条输入127.0.0.1:8000/goods/苹果时,访问结果:
URL传递参数,可带多个参数,是一种以变量来进行赋值操作的,我们可通过 request.Get.get来进行访问查找
PATH传递参数的形式
形式:path(route,view,name=None,kwargs=None).
route就是我们要传递的参数的URL,用<>来定义,默认的类型为str
- int 类型 匹配0或正数的整型
- str 类型为我们默认的类型 其中不能包括斜杠
- slug 可以由-和_组成的英文字母或数字而组成的字符串
- uuid:匹配uuid的字符串
- path:匹配非空的字符串(可以包含\)
那么我们将一个个来给大家介绍
int 类型
int类型就是只能传入整型(数字)
比如我们在url中添加我们的一条路由记录
urls下:
urlpatterns = [
....
url('book\<int:page>',
....]
views下
def book(request,page):
text= '页数为{}'.format(page)
return HttpResponse(text)
在网页中输入127.0.0.1:8000/book/1
str类型
urls.py下
urlpatterns = [
...
path('book/<author>',author),#因为默认类型就是为str类型
...
views.py
def author(request,author):
text = '本书作者为{}'.format(author)
return HttpResponse(text)
slug类型
urls.py下
urlpatterns = [
...
path('Verification_Code/<slug:number>',verification)
...
]
views.py
def verification(request,number):
return HttpResponse('验证成功!')
在浏览器中输入127.0.0.1:8000/Verification_Code/1-2
uuid
urls.py下
urlpatterns = [
...
path('Serial_Number/<uuid:num>',Serial),
...
]
views.py下
def Serial(request,num):
txt = 'uuid为:{}'.format(num)
return HttpResponse(txt)
大家可能会有所疑惑,那我们怎么生成我们的uuid呢
- 1)我们在CMD中输入python
- 2)导入库(import uuid)
- 3)print(uuid.uuid4())
在我们的浏览器中输入http://127.0.0.1:8000/Serial_Number/26d030ad-aaba-4036-92c5-ebdaec42a001
成功访问:
path
path匹配非空的字符串(可匹配斜杠)
urls.py下:
urlpatterns = [
...
path('txt/<path:n>',i)
]
views.py下
def i(request,n):
return HttpResponse('欧克')
终于写完了,在此祝大家国庆假期快乐哟!