Django 基础(一)——url配置和传参

一、django开发流程

  1. 创建app应用。python manage.py startapp firstapp
  2. 在新创建的app中 models 模块创建类管理数据库数据。
  3. 在新创建的app中 urls.py 模块 配置映射。
  4. 在新创建的app中的 views.py 模块 定义视图函数,实现前后端的交互。
  5. 启动服务。

二、URL配置语法

1.一般匹配
	 path('hello/','views.hello')

等效于

	path('http://localhost:8000/hello/','views.hello')

因为在 settings.py 中默认配置了添加 ‘http://localhost:8000’ 前缀。

2.正则匹配
  • 需要提前导入相关模块from django.urls import re_path
  • 模糊匹配:利用元字符实现不同匹配,参考下表。
  • 精确匹配: ^表示以什么开头, $ 表示以什么结尾。
元字符用法举例
[]指定字符集,可以单独列出,也可以用‘-’指定字符范围。[abc]、[a-c]匹配任意字符a、b、c。
^补充集合,匹配未在类中出现的字符。[^a]匹配除a之外的其他字符。
\后加元字符转义元字符;后加特殊字符表示预定义字符集。"\w"表示任何数字和字母字符,相当于[a-zA-Z0-9]。

其他元字符的使用参考 正则表达式HOWTO

3.全局与局部配置

每个App都应该有一个独立的url-conf,在每个app下创建一个新的urls.py文件,然后在全局的urls.py中来包含各个app的url-conf。举例如下:

  • 独立app的 urls.py
 	from django.urls import path,re_path
	from view_app.views import hello  #从app下的 views.py 模块导入hello()方法

	urlpatterns = [
		#以下两种url路径都可跳转到 views.py 中的hello()方法。
    	path('hello/',hello),
    	re_path(r'hello/\d{2,5}/\w+/',hello), #正则表达式的模糊匹配
    ]
  • 全局 urls.py :使用include包含各个app的url-conf
 	from django.contrib import admin 
	from django.urls import path,re_path,inlcude  

	from view_app.views import hello
		urlpatterns = [
    	path('admin/', admin.site.urls), #系统自动创建的
   	 	path('view_app/',include("view_app.urls")),  # 导入外部的urls模块
   	 ]

三、url 向视图函数传参

1. 一般参数

url传递的参数 和 视图函数要接受的参数 数量和名字 必须一致,如下:

  • urls.py模块
	path('hello/<name>/<age>/', views.hello)`` #尖括号中是参数名字`,以视图函数参数名要相同(除了request)
  • views.py模块
	def hello(request,name,age):
		print(name)
  	 	print(age)
   	    return HttpResponse('你好')

如果将<age>改为 <int:age>,会进行类型约束,如果传入参数不为int型报错,相似的有:
int:接收整数
str:字符串
path:可以接收包含"/"的路径
slug:接收【数字、字母、下划线、中划线】四种字符

3. 正则传参

方法一:
用括号包围的正则表达式形成一个捕获组,不仅匹配路径,还可以捕获数据。这时因为没有命名所以使用顺序传参的方式传给视图函数。

	re_path('hello/([a-z]{3})/([0-9]{2})', views.hello) #包含两个捕获组
	def hello(request,a1,a2):
	print(a1)
	print(a2)
	return HttpResponse('你好')

方法二:
通过 “?P” 为正则表达式命名,这时便与一般传参的要求相同: url 中的参数和视图参数中的 名字数量必须相同

	re_path('hello/(?P<name>[a-z]{3})/(?P<age>[0-9]{2})', views.hello)
	def hello(request,name,age):
	print(name)
	print(age)
	return HttpResponse('你好')

正则匹配是模糊匹配时,实际传参与取决于{}中的数字。举个例子:

   re_path('hello/(?P<name>[a-z]{3})/(?P<age>[0-9]{2})', views.hello)

假设 浏览器的 url 后两个字段为 “abc/18” 匹配上面的正则表达式,将name = ‘liubei’,age = '18’传入hello方法;
当 url 后两个字段变为 “abcde/123” 同样匹配上面的正则表达式,会将 name = “abc”,age = "12"传入hello方法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值