第十七 Django
1.安装Django
1.1.安装Django及升级pip
1.2.创建项目
1.3.项目说明
1.4.配置第一个项目
1.4.1.创建函数
from django.shortcuts import render,HttpResponse import datetime # Create your views here. def showtime(request): cur_time=datetime.datetime.now() return HttpResponse(str(cur_time))
1.4.2.配置url
"""djone URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/2.1/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path from cklsite import views urlpatterns = [ path('admin/', admin.site.urls), path('timer/',views.showtime) ]
1.4.3.启动程序
$ python manage.py runserver
1.4.4.页面访问
启动了8000端口
输入访问路径:
2.模拟登陆验证
2.1.先看看GET和POST的区别
https://www.cnblogs.com/logsharing/p/8448446.html
2.2.登录配置
2.2.1.views新增登录方法
from django.shortcuts import render,HttpResponse import datetime # Create your views here. def showtime(request): cur_time=datetime.datetime.now() return HttpResponse(str(cur_time)) def login(request): return render(request, "cklsite/login.html") # HttpResponse返回字符串,render返回html
html的路径在templates里,这个设定在settings.py
新增目录:
2.2.2.配置url
from django.contrib import admin from django.urls import path from cklsite import views urlpatterns = [ path('admin/', admin.site.urls), path('timer/',views.showtime), path('login/',views.login) ]
2.2.3.启动请求页面
get的提交请求,显示在地址栏上了
2.3.配置验证
2.3.1.配置views
from django.shortcuts import render,HttpResponse import datetime # Create your views here. def showtime(request): cur_time=datetime.datetime.now() return HttpResponse(str(cur_time)) def login(request): return render(request, "cklsite/login.html") # HttpResponse返回字符串,render返回html def validate(request): return HttpResponse("验证成功")
2.3.2.配置url
from django.contrib import admin from django.urls import path from cklsite import views urlpatterns = [ path('admin/', admin.site.urls), path('timer/',views.showtime), path('login/',views.login), path('validate/',views.validate) ]
2.3.3.配置login提交路径
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login Home</title> </head> <body> <h3>登录页面</h3> <form action="http://127.0.0.1:8000/validate/"> <p>姓名<input type="text" name="user"></p> <p>密码<input type="password" name="pwd"></p> <input type="submit"> </form> </body> </html>
2.3.4.提交登录
2.4.验证的内容
2.4.1.验证请求
当提交用户名和密码后:
def validate(request): print(request.GET) print(request.POST) return HttpResponse("验证成功")
2.5.提交改为post
2.5.1.修改请求
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login Home</title> </head> <body> <h3>登录页面</h3> <form action="http://127.0.0.1:8000/validate/" method="post"> <p>姓名<input type="text" name="user"></p> <p>密码<input type="password" name="pwd"></p> <input type="submit"> </form> </body> </html>
2.5.2.提交请求
2.5.3.关闭middleware的csft
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
再次提交:
#是因为验证方法里面的GET方法,修改为POST的
2.5.4.修改如下
def validate(request): # print(request.GET["user"]) # print(request.POST) username=request.POST.get("user") password=request.POST.get("pwd") if username == 'ckl' and password == '123': return HttpResponse("验证成功") else: return HttpResponse("验证失败咧")
2.5.5.登录
3.关于URL
3.1.创建新的项目
3.2.添加url
"""djone URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/2.1/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path from cklsite import views from blog import views as bview urlpatterns = [ path('admin/', admin.site.urls), path('timer/',views.showtime), path('login/',views.login), path('validate/',views.validate), path('blog/article/2004/',bview.article_year) ]
3.3.添加views返回方法
from django.shortcuts import render,HttpResponse # Create your views here. def article_year(request): return HttpResponse("2004")
查看返回:
#这样的匹配写死了,如果我要匹配2003呢?
导入url,对于路径写成正则表达式
from django.contrib import admin from django.urls import path from django.conf.urls import url from cklsite import views from blog import views as bview urlpatterns = [ path('admin/', admin.site.urls), path('timer/',views.showtime), path('login/',views.login), path('validate/',views.validate), url(r'^blog/article/\d+/',bview.article_year) ]
再次访问:
3.4.有名分组
3.4.1.如果是用户输入年份,返回年份
思考:这时候就需要对年份的子串进行分组,如下:
from django.contrib import admin from django.urls import path from django.conf.urls import url from cklsite import views from blog import views as bview urlpatterns = [ path('admin/', admin.site.urls), path('timer/',views.showtime), path('login/',views.login), path('validate/',views.validate), url(r'^blog/article/(\d+)/',bview.article_year) ]
效果:
需要两个参数,但是只传了一个,也就是:
url(r'^blog/article/(\d+)/',bview.article_year) #article_year(request,2045)
修改方法:
from django.shortcuts import render,HttpResponse # Create your views here. def article_year(request,year): return HttpResponse(str(year))
结果:
3.4.2.用户输入年月
编辑URL:
from django.contrib import admin from django.urls import path from django.conf.urls import url from cklsite import views from blog import views as bview urlpatterns = [ path('admin/', admin.site.urls), path('timer/',views.showtime), path('login/',views.login), path('validate/',views.validate), url(r'^blog/article/(\d+)/$',bview.article_year), url(r'^blog/article/(\d+)/(\d+)/$',bview.article_year_month) #分组两个,函数需要两个实参 ]
编辑view
def article_year_month(request,year,month): return HttpResponse(year + month)
访问:
#分组几个,函数就需要几个参数
3.4.3.URL匹配顺序
URL匹配顺序从上到下的,如果增加这样的:
urlpatterns = [ path('admin/', admin.site.urls), path('timer/',views.showtime), path('login/',views.login), path('validate/',views.validate), url(r'^blog/article/(\d+)/$',bview.article_year), url(r'^blog/article/2008/$',bview.test), url(r'^blog/article/(\d+)/(\d+)/$',bview.article_year_month) ]
增加view
def test(request): return HttpResponse("test!")
访问:
#无法访问到test,是因为test的路径已经被之前的覆盖了
3.5.无名分组
3.5.1.如果用户输入的年月没有按顺序,这时候如何解决?
有名分组解决
"""djone URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/2.1/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path from django.conf.urls import url from cklsite import views from blog import views as bview urlpatterns = [ path('admin/', admin.site.urls), path('timer/',views.showtime), path('login/',views.login), path('validate/',views.validate), url(r'^blog/article/(\d+)/$',bview.article_year), url(r'^blog/article/2008/$',bview.test), #url(r'^blog/article/(\d+)/(\d+)/$',bview.article_year_month), url(r'^blog/article/(?P<year_id>\d+)/(?P<month_id>\d+)/$',bview.article_year_month) #article_year_month(year_id=xx,month_id=xx) ]
修改方法:
def article_year_month(request,year_id,month_id): return HttpResponse(year_id + month_id)
访问:
4.系统分发
当前所有的url都写在总的url,如果有5个项目每个项目有10个url,那么就有50个url,解决办法就是url分发
4.1.总的url引入分发的url
"""djone URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/2.1/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path from django.conf.urls import url,include from cklsite import views from blog import views as bview urlpatterns = [ path('admin/', admin.site.urls), url(r'^blog/',include('blog.urls')) ]
4.2.blog的url
from django.urls import path from django.conf.urls import url,include from blog import views as bview #import view 这样写错误,因为当前文件非执行文件,所以程序无法找到view #真正的执行文件是manage.py,而其同级目录没有views,所以会报错 urlpatterns = [ url(r'^article/(\d+)/$',bview.article_year), url(r'^article/2008/$',bview.test), url(r'^article/(?P<year_id>\d+)/(?P<month_id>\d+)/$',bview.article_year_month) #article_year_month(year_id=xx,month_id=xx) ]
路径如下,当前的manage下没有view
运行结果:
5.反向解析
5.1.用户登录
5.1.1.登录url
"""djone URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/2.1/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path from django.conf.urls import url,include from cklsite import views as ckl_views from blog import views as bview urlpatterns = [ path('admin/', admin.site.urls), path('login/',ckl_views.login), url(r'^blog/',include('blog.urls')) ]
5.1.2.登录方法
from django.shortcuts import render,HttpResponse import datetime def login(request): if request.method == "POST": #只需要一个方法,对请求的方式进行判断 user=request.POST.get("user") pwd=request.POST.get("pwd") return HttpResponse("login successfully!") return render(request,"cklsite/login.html")
5.1.3.登录html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login Home</title> </head> <body> <h3>登录页面</h3> <form action="/login/" method="post"> <p>姓名<input type="text" name="user"></p> <p>密码<input type="password" name="pwd"></p> <input type="submit"> </form> </body> </html>
5.1.4.登录请求
5.2.反向解析
5.2.1.登录url发生变化
from django.contrib import admin from django.urls import path from django.conf.urls import url,include from cklsite import views as ckl_views from blog import views as bview urlpatterns = [ path('admin/', admin.site.urls), path('login.html/',ckl_views.login), ]
请求失败:
#解决办法:
修改login.html里面的路径:
<form action="/login/" method="post">
html如果有几百个,那每个都需要修改,这样的话,效率太低,这时候就需要用到反射了
5.2.2.修改url
from django.contrib import admin from django.urls import path from django.conf.urls import url,include from cklsite import views as ckl_views from blog import views as bview urlpatterns = [ path('admin/', admin.site.urls), path('login.html/',ckl_views.login,name="LOGIN") ]
5.2.3.修改html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login Home</title> </head> <body> <h3>登录页面</h3> <form action="{% url 'LOGIN' %}" method="post"> <p>姓名<input type="text" name="user"></p> <p>密码<input type="password" name="pwd"></p> <input type="submit"> </form> </body> </html>
这里{% url 'LOGIN' %} 是模板语法,render解析url,将LOGIN解析为url对应的login.html
访问测试:
6.其它方法
常用的请求方法:
request(请求对象):
request.GET get请求数据
request.POST post请求数据
request.POST.getlist() 请求多条数据
request.method 请求方法
request.path 请求路径
request.get_full_path() 请求全路径
6.1.如果获取多个值
6.1.1.获取多选框内容html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login Home</title> </head> <body> <h3>登录页面</h3> <form action="{% url 'LOGIN' %}" method="post"> <p>姓名<input type="text" name="user"></p> <p>密码<input type="password" name="pwd"></p> <p> 爱好 <input type="checkbox" name="hobby" value="1">台球 <input type="checkbox" name="hobby" value="2">高尔夫 <input type="checkbox" name="hobby" value="3">水球 </p> <input type="submit"> </form> </body> </html>
6.1.2.方法
from django.shortcuts import render,HttpResponse import datetime def login(request): if request.method == "POST": #只需要一个方法,对请求的方式进行判断 user=request.POST.get("user") pwd=request.POST.get("pwd") hobby=request.POST.get("hobby") print("hobby:",hobby) return HttpResponse("login successfully!") return render(request,"cklsite/login.html")
6.1.3.请求页面
但是,只获取到一个值:
这时候需要getlist方法:
def login(request): if request.method == "POST": #只需要一个方法,对请求的方式进行判断 user=request.POST.get("user") pwd=request.POST.get("pwd") hobby=request.POST.getlist("hobby") print("hobby:",hobby) return HttpResponse("login successfully!") return render(request,"cklsite/login.html")
再次查看:
6.2.下拉选项框获取多个值
6.2.1.html下拉选项框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login Home</title> </head> <body> <h3>登录页面</h3> <form action="{% url 'LOGIN' %}" method="post"> <p>姓名<input type="text" name="user"></p> <p>密码<input type="password" name="pwd"></p> <p> 爱好 <input type="checkbox" name="hobby" value="1">台球 <input type="checkbox" name="hobby" value="2">高尔夫 <input type="checkbox" name="hobby" value="3">水球 </p> <select name="pro" id="" multiple size="3"> <option value="11">陕西省</option> <option value="22">海南省</option> <option value="33">上海市</option> </select> <input type="submit"> </form> </body> </html>
6.2.2.方法
def login(request): if request.method == "POST": #只需要一个方法,对请求的方式进行判断 user=request.POST.get("user") pwd=request.POST.get("pwd") hobby=request.POST.getlist("hobby") print("hobby:",hobby) pro=request.POST.getlist("pro") print("pro:",pro) return HttpResponse("login successfully!") return render(request,"cklsite/login.html")
效果: