草庐IT

零基础入手Django(二):url路由配置及渲染方式

IT小叮当 2023-10-25 原文

今天,小叮当来为大家继续分享Django的干货。

一、url基本概念及格式

想要掌握url不妨回想下我们平时的上网经历。我们平常是怎样访问百度的呢?

你很定会说“那还不简单,只要在浏览器里输个网址,不就行了?”

妥了,你只要知道这个,url便不难理解了,url可类似的看作是一种网址。

1.url基本概念

URL全称为(UniformResoureLocator)意为“统一资源定位符”。URL是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。

互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

2.url格式

url的格式如下:

schema://host[:port#]/path/.../[?query-string][#anchor]

schema:指定使用的协议(例如:http, https, ftp)
host:Http服务器的IP地址或者域名
port:端口号,http默认是80端口
path:访问资源的路径
query-string:发送给http服务器的数据
anchor:锚点# 

看到这儿,你可能有点懵,没关系,我们举个例子,你就会有豁然开朗的感觉。

就以我们上次配置的django项目中的hello网址为例:

“http://192.168.255.130:8000/hello/”

(1)schema(协议):http

  (2)host(主机,常指服务器主机):192.168.255.130

(3)port(端口):8000

(4)path(路径):hello/

3.urls.py的作用

经过上次的hello_django配置,相必大家已基本了解urls.py的作用,简单来说就是配置url,以供用户访问。

URL配置(URLconf)就像是Django所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表。

以这样的方式告诉Django,对于那个URL调用那段代码。url的加载就是从配置文件中开始的。

要上述内容不易理解,不妨这样认为,“urls.py就是为url定义路径,并调用视图函数以返回页面,呈现给用户。”

二、path和re_path

1.path传参

例如,我的视图函数返回的是

str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符

2.re_path正则匹配

值得注意的是,Django2.0的re_path和Djano1.11的urls是相同的。

我们首先在urls.py的django.urls包中导入re_path

在views.py中定义新的视图函数,供re_path调用

代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-  
__author__ = 'IT小叮当'
__time__ = '2019-01-10 14:19'
from django.http import HttpResponse

def hello(request,project):
    return HttpResponse('大家好我是IT小叮当,我在编写%s项目!'%project)

def xdd(request):
    return HttpResponse('大家好我是IT小叮当,我18岁了!')

在urls.py中使用re_path调用新建的视图函数xdd

代码如下:

from django.contrib import admin
from django.urls import path,re_path

from .views import *

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/<int:project>/',hello),
    re_path('xdd/',xdd)
]

启动服务器后

在浏览器中输入“http://192.168.255.130:8000/xdd/”进行访问

貌似一切正常,但,当我们在xdd前输入乱码时,竟也可以访问!

输入的网址为”http://192.168.255.130:8000/qinfenxuexifdxdd/“

我们在xdd/后输入乱码时,也可访问!!

输入的网址为” http://192.168.255.130:8000/xdd/sdfsdf “

这是因为,正则匹配时,只写一个字符串,表示的是包含关系。当我们使用re_path时,只写了”xdd/",所以只要地址中包含“xdd/”的均可就返回视图函数。

当我们需要限定访问路径为“xdd/”时,就需要加上正则表达式来进行规范。

将urls.py中的路径修改为

#!/usr/bin/env python
# -*- coding:utf-8 -*-  
__author__ = 'IT小叮当'
__time__ = '2019-01-10 14:19'
from django.http import HttpResponse

def hello(request,project):
    return HttpResponse('大家好我是IT小叮当,我在编写%s项目!'%project)

def xdd(request):
    return HttpResponse('大家好我是IT小叮当,我18岁了!')

def xdd2(request,age):
    return HttpResponse('大家好我是IT小叮当,我%s岁了!'%age)

在urls.py中用正则表达式配置路径

代码如下:

from django.contrib import admin
from django.urls import path,re_path

from .views import *

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/<int:project>/',hello),
    re_path('^xdd/$',xdd),
    re_path('^xdd2/(?P<age>[0-9]+)/',xdd2),
]

在正则表达式中

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.

def book_index(request):
    return HttpResponse('这是小叮当返回的book的主页')

(2)在我们新建好的名为“book”的app中新建一个urls.py

在“book”app的urls.py中输入以下代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-  
__author__ = 'IT小叮当'
__time__ = '2019-01-11 17:42'
from django.urls import path
from . import  views

urlpatterns=[
    path('index/',views.book_index),
]

界面如下:

(3)在主目录下的urls.py中通过django.urls包导入include,设置分路由

如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-  
__author__ = 'IT小叮当'
__time__ = '2019-01-11 17:42'
from django.urls import path
from . import  views

urlpatterns=[
    path('index/',views.book_index,{'test':'ture'}),
]

(2)在对应视图函数中,通过”**kwargs“进行接收。

具体代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-  
__author__ = 'IT小叮当'
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
#通过kwargs.get()的方法获取值
def book_index(request,**kwargs):
    value=kwargs.get('test')
    return HttpResponse('这是小叮当返回的book的主页,我获取到参数是%s'%value)

在浏览器中检测

输入”http://192.168.255.130:8000/book/index/“

显示结果为

值得注意的是,当在”主路由“中,以这样的方式传参时,所有的分路由就被**kwargs批量传参了。.

分路由的视图函数,均要加上”**kwargs“接受参数才行,否则便会报错。

报错为

修改视图函数,加上”**kwargs“后

结果正常显示

3.使用name和reverse进行页面重定向

当我们制作了新的页面配置了新的url,并想使旧的url重定向到新的页面时,使用name和reverse可大大简化我们的步骤。

(1)关于重定向

(2)在"book"app中新建两个视图函数atrticle1和article2

代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-  
__author__ = 'IT小叮当'
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.

def book_index(request,**kwargs):
    value=kwargs.get('test')
    return HttpResponse('这是小叮当返回的book的主页,我获取到参数是%s'%value)

def book_index2(request,**kwargs):
    return HttpResponse('这是小叮当返回的book的主页2,我获取到参数')

def article(request,**kwargs):
        return HttpResponse('这是小叮当的文章页面')


def article2(request, **kwargs):
    return HttpResponse('这是小叮当的新新新文章页面')

添加对应的路由

代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-  
__author__ = 'IT小叮当'
#!/usr/bin/env python
# -*- coding:utf-8 -*-  
__author__ = 'IT小叮当'
__time__ = '2019-01-11 17:42'
from django.urls import path
from . import  views

urlpatterns=[
    path('index/',views.book_index,{'test':'ture'}),
    path('index2/', views.book_index2),
    path('article/', views.article),
    path('article2/', views.article2),
]

在浏览中访问如下

输入“http://192.168.255.130:8000/book/article/”,显示为

输入“http://192.168.255.130:8000/book/article2/”,显示为

(3)在"book"app下的views.py中,通过django.shortcus导入redirect

更改article视图函数

代码如下:

def index3(request,**kwargs):
    return render(request,'book/index.html',context={'name':'IT小叮当渲染方式二'})

值的注意的是,在模版(html)中向视图函数传参时,要使用到“context"

urls.py中配置路由

path('index3/',views.index3)

浏览器中查看

有关零基础入手Django(二):url路由配置及渲染方式的更多相关文章

  1. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  5. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  6. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  7. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  8. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  9. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  10. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

随机推荐