Django URL (路由系统) URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。
urlpatterns = [
path(正则表达式, views视图函数,参数,别名),
]
复制代码
参数说明:
一个正则表达式字符串
一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
可选的要传递给视图函数的默认参数(字典形式)
一个可选的name参数
Here’s a sample URLconf:
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/[0-9]{4}/', views.year_archive),
path('articles/([0-9]{4})/', views.year_archive), #()内的内容会传给视图函数
path('articles/([0-9]{4})/([0-9]{2})/', views.month_archive),
path('articles/([0-9]{4})/([0-9]{2})/([0-9]+)/', views.article_detail),
]
复制代码
Named groups 正则分组
import re
ret=re.search('(?P<id>\d{3})/(?P<name>\w{3})','weeew34ttt123/ooo')
print(ret.group())
print(ret.group('id'))
print(ret.group('name'))
复制代码
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/(?P<year>[0-9]{4})/', views.year_archive),
path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.month_archive),
path(^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/', views.article_detail),
]
复制代码
添加额外的参数
urlpatterns = [
path('blog/(?P<year>[0-9]{4})/', views.year_archive, {'foo': 'bar'}),
]
复制代码
为路由映射设置名称
path('home', views.home, name='h1'),
path('index/(\d*)', views.index, name='h2'),
复制代码
设置名称之后,可以在不同的地方调用,如:
模板中使用生成URL {% url 'h2' 2012 %}
根据app对路由规则进行分类
path('blog/', include('blog.urls')),
name param
urlpatterns = [
path('index',views.index,name='bieming'),
path('admin/', admin.site.urls),
# path('articles/2003/', views.special_case_2003),
path('articles/([0-9]{4})/$', views.year_archive),
# path('articles/([0-9]{4})/([0-9]{2})/', views.month_archive),
# path('articles/([0-9]{4})/([0-9]{2})/([0-9]+)/', views.article_detail),
]
###################
def index(req,name):
print(name)
if req.method=='POST':
username=req.POST.get('username')
password=req.POST.get('password')
if username=='zhangsan' and password=='123':
return HttpResponse("登陆成功")
return render(req,'index.html')
#####################
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# <form action="/index/" method="post">#}
<form action="{% url 'bieming' %}" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="submit">
</form>
</body>
</html>
#######################
复制代码
Django Views(视图函数)
http请求中产生两个核心对象: http请求:HttpRequest对象
http响应:HttpResponse对象
复制代码
所在位置:django.http
之前我们用到的参数request就是HttpRequest 检测方法:isinstance(request,HttpRequest)
HttpRequest对象的属性和方法:
# path: 请求页面的全路径,不包括域名
# method: 请求中使用的HTTP方法的字符串表示。全大写表示。例如
# if req.method=="GET":
# do_something()
# elseif req.method=="POST":
# do_something_else()
# GET: 包含所有HTTP GET参数的类字典对象
# POST: 包含所有HTTP POST参数的类字典对象
# 服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过
# HTTP POST方法提交请求,但是表单中可能没有数据,因此不能使用
# if req.POST来判断是否使用了HTTP POST 方法;应该使用 if req.method=="POST"
#
# COOKIES: 包含所有cookies的标准Python字典对象;keys和values都是字符串。
# FILES: 包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中 name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:
# filename: 上传文件名,用字符串表示
# content_type: 上传文件的Content Type
# content: 上传文件的原始内容
# user: 是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
# 没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
# 可以通过user的is_authenticated()方法来辨别用户是否登陆:
# if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
# 时该属性才可用
#
# session: 唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。
#方法
get_full_path(), 比如:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path()得到的结果就是/index33/?name=123
req.path:/index33
注意一个常用方法:request.POST.getlist(''),获取列表参数
复制代码
HttpResponse对象: 对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象。
HttpResponse类在django.http.HttpResponse
在HttpResponse对象上扩展的常用方法:
页面渲染: render()(推荐)<br> render_to_response(),
页面跳转: redirect("路径")
locals(): 可以直接将函数中所有的变量传给模板
复制代码
-----------------------------------url.py
path("login", views.login),
path("yuan_back", views.yuan_back),
-----------------------------------views.py
复制代码
def login(req):
if req.method=="POST":
if 1:
# return redirect("/yuan_back/")
name="yuanhao"
return render(req,"my backend.html",locals())
return render(req,"login.html",locals())
def yuan_back(req):
name="zhansan"
return render(req,"my backend.html",locals())
-----------------------------------login.html
<form action="/login/" method="post">
<p>姓名<input type="text" name="username"></p>
<p>性别<input type="text" name="sex"></p>
<p>邮箱<input type="text" name="email"></p>
<p><input type="submit" value="submit"></p>
</form>
-----------------------------------my backend.html
<h1>用户{{ name }}你好</h1>
#总结: render和redirect的区别:
# 1 if render的页面需要模板语言渲染,需要的将数据库的数据加载到html,那么所有的这一部分
# 除了写在yuan_back的视图函数中,必须还要写在login中,代码重复,没有解耦.
# 2 the most important: url没有跳转到/yuan_back/,而是还在/login/,所以当刷新后
# 又得重新登录.
复制代码