第十七 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")

效果:

posted @ 2017-08-23 15:09  ckl893  阅读(235)  评论(0编辑  收藏  举报