Django框架学习笔记(二)URL路由

前言

大家好,我是小雨。
这一节我们继续介绍Django的知识,我们知道
URL是web访问的第一步,当用户对服务器有一个http请求的时候,Django开始响应URL路由,校验这个URL是否存在,如果存在,定位到Views里的某一个方法或者函数;如果不存在,返回404页面。这一节,我们就重点介绍Django中URL的知识。

一、了解URL

1. 注意区分域名、主机名、URL

URL全称(uniform resource locator)同意资源定位系统,是获取Internet资源的标准路径。我们经常容易搞混的三个概念域名、主机名、URL,就以短视频平台bilibili为例,大家可以看一下域名、主机、URL的区别:


区分域名主机名URL

主机名包含了域名,可能不同的主机名分别对应了不同的IP地址,URL包含了协议、主机名或ip地址等其它内容,而我们的域名、主机名只是其中的一部分。

2. URL的结构

标准的URL结构为:

scheme://host:port/path/?query-string=xxx
url结构
3.网站多主机与多路径的使用

当一个网站比较大的时候,每一个模块就是一个独立的网站,每一个子模块都对应着独立的服务器。像优酷就是这种类型,电影模块、电视剧模块、动漫模块都分别部署在独立的主机上。
但是,当一个网站不是很大的时候,如果同样想要具备多个模块,每个模块只能是网站根目录下的子文件夹,让所有的模块都共享一个服务器,我们这里的URL路由就是主要针对这种情况来使用的。

二、URL路由的基本使用

1. Web请求的过程

(1)客户端对服务器有一个HttpRequest请求;
(2)服务器把数据使用http封装并返回HttpResponse。

2. URL路由的工作流程:

web服务器根据用户访问的URL在URL列表中进行匹配,如果匹配上了,则区执行相应的Views中方法,如果匹配不上则返回404错误。
当我们创建了一个Django项目的时候,首先需要了解的是项目同名子文件夹下的urls.py,

urlpatterns = [
    path('admin/', admin.site.urls),
]

列表中的每一个path由两部分组成:路径相应views里的函数

三、URL路由基本案例

1.同目录下创建views

如果我们在当前目录下新建一个views.py的文件,定义一个index方法,用来返回字符串。

from django.http import HttpResponse
def index(request):
    return HttpResponse("这是首页!")

在urls.py中将views里的index方法添加的URL中,我们只需要添加一个这样的路径:

from . import views  # 表示在当前文件夹下导入views模块
path('',views.index)  # 路径写空表示直接用主机名就可以访问

效果演示:


同目录下创建views.gif

如果使用Pycharm开发Django,项目只要启动一次后,再修改代码,修改后Web内容会同步变化,不需要手动重启Django

2. URL路由结合app的基本使用

标准的做法views应该要放在app文件夹中,创建app文件夹可以使用终端命令:

python manage.py startapp app01

这样就会在根目录下创建一个叫app01的文件夹,里面自动包含了modelsviews等文件。
与上面在同一个文件夹中创建views相比,我们唯一的不同就是导入views时,声明app01这个文件夹就可以了:

from app01 import views
3. 修改Django默认端口

http服务默认使用80端口,Django为了防止与当前主机上可能存在的80端口发生冲突使用了8000端口,如果当前主机上没有80端口占用的话,怎么修改当前项目为8000端口呢?
实际上,我们点击Edit Configurations...按钮就可以修改默认端口。

修改Django的端口为80

当我们修改成80端口后,点击运行按钮之后。在浏览器地址栏中直接输入主机ip地址就能访问了,就不需要再添加端口号了。但是如果使用命令python manage.py runserver开启服务器,默认打开的还是8000端口,这里需要我们手动声明ip和端口号,命令要写成python manage.py runserver 127.0.0.1:80,这样就成功了。

4. 访问局域网或者虚拟机里的Django服务器

如果局域网或者虚拟机中某台主机运行了Django服务,我们想通过ip地址访问它。需要做哪些配置呢?
(1)在settings.py里,ALLOWED_HOSTS = ['*'],放行所有主机名。
(2)在命令行启动Django服务的时候使用sudo python manage.py runserver 0.0.0.0:80
(3)访问虚拟机的服务注意使用NAT模式便于宿主机访问虚拟机ip

访问局域网中的Django服务器

四、使用URL传值

1. 使用场景

我们发现很多网站的某个页面的URL末尾都有一段字符串,不同的页面URL后的字符串值都不一样。同时我们可以根据这个指定的URL值访问到对应的网页内容。我们是否可以这样认为,我们是通过URL传值给服务器,让服务器做出相应的反馈。那么Django是如何实现这样的一个过程的呢?

2. 需求

我们想要实现这样的功能,在浏览器地址栏输入主机名:movie,回车后服务器返回电影主页;当在地址栏输入主机名:movie/1234,服务器返回马上播放电影的编号为:1234。当然,这里的1234,我可以替换为任意字符串。

3. 实现

我们可以在views.py中定义movie方法:

from django.http import HttpResponse
def movie(request):
    return HttpResponse("电影主页!")

接着在urls.py中添加utls.py中把movie页面加进来:

path('movie/', views.movie),

这样就实现了电影主页的显示。如果想让字符串也传进来的话,我们定义一个movie_detail方法:

def movie_detail(request,movie_id):
    return HttpResponse("马上播放的电影编号为:%s" % movie_id)

urls.py中添加

path('movie/<movie_id>/', views.movie_detail),

这里的一对尖括号表明了我们可以传入一个任意字符串,如果要把传入的值限定为整型数字,可以写成<int:movie_id>,这样就限定了传入的类型。

4. 效果演示
URL传值

五、使用查询字符串传值

1. 使用场景

我们在使用百度检索关键词python时,观察一下URL前面部分的内容为

https://www.baidu.com/s?wd=python

这里的要检索内容python通过网页中的输入框传给URL中的wd关键字。Django框架也能实现类似的功能,该怎么实现呢?

2.使用方法

这里我们以查询某个城市的天气状况为例,city用来接收城市名,fell用来接收感觉状况信息。
在views.py中,定义一个search_forecast方法,通过request.GET获取URL中的关键字。

def search_forecast(request):
    weather_city = request.GET.get("city")
    fell_city = request.GET.get("fell")
    return HttpResponse(" %s今天的天气真不错,感觉很%s!" % (weather_city,fell_city))

然后把路径加入到urls.py中,

path('weather/detail/', views.search_forecast),

这样我们在URL中传入关键字的值,Django框架就会获取关键字的值并反馈到页面中来。

注意:多个关键字在URL中通过&进行分隔

3. 效果演示
使用查询字符串传值

六、使用正则表达式判断URL路径

我们知道path是URL中主机名后面的路径,在地址栏输入后系统会对其进行校验,如果匹配,则执行views里对应的函数,
re_path是一个使用正则表达式来校验URL路径的模块。

1. 使用场景

我们希望输入的路径中含有学号sno和爱好hobby,学号使用正则表达式限定格式为21开头的5位数字;爱好为数字0-3的编号之一。

2. 实现过程

如果要使用正则表达式校验路径,需要导入re_path模块

from django.urls import re_path

我们先在views中定义显示反馈网页内容的方法student_info:

def student_info(request,sno,hobby):
    hobby_kind = ['唱','跳','rap','篮球']
    return HttpResponse("你的学号是:%s,你的爱好是:%s" % (sno,hobby_kind[int(hobby)]))

然后在urls.py中添加校验路径的元素:

re_path('student/(?P<sno>[2][1]\d{3})/(?P<hobby>[0-3])/',app01_views.student_num),

注意校验的的格式是


re_url正则校验格式
3.效果演示
使用正则校验URL

最后

本节我们介绍了Django框架里URL的知识,介绍了URL的构成、URL传值、URL查询字符串传值、URL正则表达式判断合法性后传值。大家最好自己动手实际操作一遍以便更好的理解。下一讲,我们继续介绍Django Templates的知识。感谢大家的阅读!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容