一、django开发流程
- 创建app应用。
python manage.py startapp firstapp
- 在新创建的app中 models 模块创建类管理数据库数据。
- 在新创建的app中 urls.py 模块 配置映射。
- 在新创建的app中的 views.py 模块 定义视图函数,实现前后端的交互。
- 启动服务。
二、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方法。