Python【day 15】:Python学习(web框架:django学习1)

路由系统

1、每个路由规则对应一个view中的函数

1
2
3
url(r'^index/(\d*)', views.index),
url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),
url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),

2、根据app对路由规则进行一次分类

1
url(r'^web/',include('web.urls')),

django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。

from django.conf.urls import url,include
from django.contrib import admin
from app01 import views   #从app01中导入模块views.py


urlpatterns = [
    url(r'^admin/', admin.site.urls), #这些是按顺序执行,一旦匹配到了,下述就不执行
    # url(r'^index/$', views.index),  #url对应views模块中的函数index  r'^index/$'  这是个正则表达式  $以什么结尾
    # # url(r'^$', views.index),  #除了ip和端口 不带任何路径
    # # url(r'^.*$', views.index),  #除了ip和端口 路径不管是什么,都会定位到index 这个一般放在最后
    #
    # url(r'^userlist/(\d+)', views.userlist),  #http://127.0.0.1:8000/userlist/2  匹配一个或者多个数字结尾
    # #匹配多个url--例如200个 就不需要写200个函数了 写一个即可  适用场景:分页显示--博客园
    #
    # url(r'^userlist1/(\d+)/(\d+)', views.userlist1), #http://127.0.0.1:8000/userlist1/2222/22
    # #可以加2个参数,这2个参数都是数字
    #
    #  url(r'^userlist2/(?P<k1>\d+)/(?P<k2>\d+)', views.userlist2), #http://127.0.0.1:8000/userlist1/2222/223
    # #可以加2个参数,这2个参数都是数字  第一个参数赋值给k1 第二个参数赋值给k2

    #实现先通过不同的app进行分流,分流后,在每个app的urls中(没有就创建),找到对应的函数
    url(r'^app01/', include("app01.urls")),  #必须加上include,否则报错;
]

 

from django.conf.urls import url,include
from django.contrib import admin
from app01 import views   #从app01中导入模块views.py

urlpatterns = [
    url(r'^index/$', views.index),  #先在全局中找到app01,再在app01中找到index 对应的index函数
]

 

路由系统种类
1、静态路由
2、动态路由
  1、按照顺序,第n个匹配的数据,交给函数的第n个参数,严格按照顺序匹配;
  2、模版的方法,将匹配的参数,传给指定的形式参数;
3、二级路由
app01
  urls.py
project_name
  urls.py app01->include("app01.urls")

 

2缓存

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者Redis中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回,

一、配置

在settings中配置

CACHES = {

    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': os.path.join(BASE_DIR, 'cache'),
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 1000
        }
    }
}

 

二、应用

在views中设置

from django.shortcuts import render, HttpResponse
from django.views.decorators.cache import cache_page
@cache_page(60 * 1)  #此装饰器的功能是,1分钟之内,请求的返回从缓存中取值;根目录有一个专门的缓存cache文件夹
# 页面每次刷新,内容1分钟后才会变化
def cache_page(request):
current_time =str(time.time())
return HttpResponse(current_time) #每次刷新页面,都会返回不同的时间戳
#自己写缓存的思路:请求来了,首先看一下缓存中是否保存了返回结果,如果保存了,直接把缓存结果返回给用户:
#如果没有,从HttpResponse获取到结果,存到缓存中,再发给用户
 

更多:

  https://docs.djangoproject.com/en/1.9/topics/cache/
  http://djangobook.py3k.cn/2.0/chapter15/

 

3cookie和session

用户登录后,才允许看到订单页面;用户没有登录,不允许看到订单页面,回到登录页面

views页面设置


from django.shortcuts import render,HttpResponse,redirect
import time
#登录  session cookie
#需求:用户登录后,才允许看到订单页面;用户没有登录,不允许看到订单页面,回到登录页面
def login(request):
    # pass
    # return HttpResponse("login")
    if request.method=="POST":  #如果表单提交的方法是POST 必须大写
        username1 = request.POST.get("username")  #获取用户名输入框用户输入的值
        pwd1 = request.POST.get("pwd")  #获取密码输入框用户输入的值
        # print(username1)
        if username1 =="alex" and pwd1 =="123":  #用户名和密码在内存做判断,数据库没有这个值
            request.session["IS_LOGIN"]=True  #将服务端session的IS_LOGIN的值置为True  代表登录状态是已经登录
            return redirect("/app01/home/")  #重定向到home订单页面  返回字符串order  29行

    return render(request,"login.html") #如果表单提交的方法不是POST 就重定向到登录页面(相当于将用户名和密码清空)

#订单页 session cookie
def home(request):
    # //判断用户是否登录
    # is_login = request.session["IS_LOGIN"]  #获取会话中IS_LOGIN的值  如果字典的可以不存在,就报错 用get避免
    is_login = request.session.get("IS_LOGIN",False) #如果key存在就返回这个key对应的value;如果key不存在,就默认返回false
    # print(is_login)
    if is_login:      #如果IS_LOGIN的值是True,代表已经登录了,允许查看订单
        return HttpResponse("order")  #字符串返回用这个HttpResponse html页面用的是render
    else: ##如果IS_LOGIN的值不是True 返回到登录页面(重定向到登录页面)
        return redirect("/app01/login/")

html登录页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form action="/app01/login/" method="post">
{#        "/app01/login/" app前面的/不能少#}
        <input type="text" name="username"/>
        <input type="password" name="pwd"/>
        <input type="submit" name="提交"/>
    </form>

</body>
</html>

路由设置

#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author__ = 'Administrator'

from django.conf.urls import url,include
from django.contrib import admin
from app01 import views   #从app01中导入模块views.py

urlpatterns = [
    url(r'^index/$', views.index),  #先在全局中找到app01,再在app01中找到index 对应的index函数
    url(r'^cache/$', views.cache_page),  #先在全局中找到app01,再在app01中找到cache 对应的cache_page函数
    url(r'^login/$', views.login),  #先在全局中找到app01,再在app01中找到login 对应的login函数
    url(r'^home/$', views.home),  #先在全局中找到app01,再在app01中找到home 对应的home函数
]

操作Session

  获取session:request.session[key]

  设置session:reqeust.session[key] = value

 

Form

1、快速生成html标签

2、表单验证

路由url系统

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^user_list/', views.user_list),
]

html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form action="/user_list/" method="post">
        <P>主机:{{ obj.host }}<span>{{ errors.host }}</span></P>
        <P>端口:{{ obj.port }}<span>{{ errors.port }}</span></P>
        <P>邮箱:{{ obj.email }}<span>{{ errors.email }}</span></P>
        <P>手机:{{ obj.mobile }}<span>{{ errors.mobile }}</span></P>
{#        上述4行自动创建input标签 生成html标签#}
{#        <input type="text" name="host"/>#}
{#        <input type="text" name="port"/>#}
{#        <input type="text" name="email"/>#}
{#        <input type="text" name="mobile"/>#}

        <input type="submit" value="提交"/>
    </form>

</body>
</html>

views函数

# -*- coding:utf-8 -*-
from django.shortcuts import render,HttpResponse

# Create your views here.
from django import forms

# Form的作用:
# 1、生成html标签
# 2、验证用户输入的有效性

class userinfo(forms.Form):  #创建一个类,继承forms.Form累
    host = forms.CharField()  #默认必选
    port = forms.CharField()
    email = forms.EmailField(required=False)  #非必选
    mobile = forms.CharField()

def user_list(request):
    obj = userinfo() #创建对象
    if request.method=="POST": #如果方法是POST,代表是提交数据,POST必须大写
        user_input_obj = userinfo(request.POST) #把用户输入的内容(主机,端口,邮箱,手机)封装到对象中
        # print(user_input_obj.is_valid()) #判断用户输入的是是否符合必选、非必选规则,符合就是True;不符合就是false
        if user_input_obj.is_valid():  #如果合法,获取用户输入
            data=user_input_obj.clean()  #获取用户输入的数据
            print(data) #{'port': '223', 'host': '123', 'email': '123@qq.com', 'mobile': '12'}
            # 正常提交后,后台就拿到数据了
        else: #如果不合法,提示错误信息
            error_msg=user_input_obj.errors  #捕捉错误
            print(error_msg)  #后台console打印错误信息
            return render(request,"user_list.html",{"obj":user_input_obj,"errors":error_msg})
        #  前台打印错误信息

    # host=request.POST.get["host"]  #获取请求中用户输入的主机名字 name
    # port=request.POST.get["port"]  #获取请求中用户输入的端口号
    # email=request.POST.get["email"]  #获取请求中用户输入的端口号 name
    # mobile=request.POST.get["mobile"]  #获取请求中用户输入的端口号
    return render(request,"user_list.html",{"obj":obj})

    #输入不能为空(必选项不能为空,非必选项可以为空)
    # email =17137737137 (邮箱合法性验证)
    # mobile =789456455   (手机号码合法性验证)
    # mobile =789456455   (IP地址合法性验证)

 

form表单定制化

1、基础
1、表单验证
2、快速生成html标签
2、定制化
1、错误信息是写死的,搞成自定义的错误信息
1、非空-required
2、加上自定义属性--输入框的默认提示语
3、添加备注-textarea大的文本输入框
4、正则表达式验证手机号码格式
5、输入框input-ok 大的文本框-textarea-ok 下拉框-select
6、js可以写正则判断;后端的django也可以写正则判断
2、表单验证步骤:
1、创建类,这个累继承forms.Form
2、前台页面根据类的对象自动创建html标签
3、提交 request.POST包含了用户输入的所有内容
把用户输入封装到类的一个对象中obj=userinfo(request.POST)
4、用户输入是否合法
obj.is_valid()
5、如果全部合法
obj.clean() 获取用户输入的所有内容
6、如果存在不合法
obj.errors 拿到错误信息,在前台打印出来
7、添加select等插件、正则验证、设置自定义属性
8、html相关问题
#"class":"form-control" 这个class样式在前端的html定义后,就应用上了 比如字体红色,背景色
#这里也可以在html中引用bootstrap样式
#html文件中上述几行都是通过对象生成的,也可以直接写html

html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
{#        .form-control{#}
{#           background-color: red;#}
{#            color: red;#}
{#        }#}
    </style>
</head>
<body>
    <form action="/user_list/" method="post">
{#        表单数据提交到/user_list/,然后调用user_list函数#}
        <P>用户类型:{{ obj.user_type }}<span>{{ errors.user_type }}</span></P>
        <P>主机:{{ obj.host }}<span>{{ errors.host }}</span></P>
        <P>端口:{{ obj.port }}<span>{{ errors.port }}</span></P>
        <P>邮箱:{{ obj.email }}<span>{{ errors.email }}</span></P>
        <P>手机:{{ obj.mobile }}<span>{{ errors.mobile }}</span></P>
        <p>手机2:<input class="form-control" id="id_mobile" name="mobile" placeholder="手机号码" type="text"><span>{{ errors.mobile }}</span></p>
        <P>备注:{{ obj.memo }}<span>{{ errors.memo }}</span></P>
{#        上述几行都是通过对象生成的,也可以直接写html  例如上述20和21行 是一样的#}
{#        上述4行自动创建input标签 生成html标签 并且加上了错误捕捉#}
{#        <input type="text" name="host"/>#}
{#        <input type="text" name="port"/>#}
{#        <input type="text" name="email"/>#}
{#        <input type="text" name="mobile"/>#}

        <input type="submit" value="提交"/>
    </form>

</body>
</html>

路由urls文件

from django.conf.urls import url
from django.contrib import admin
from app01 import views  #导入app01的views文件

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^user_list/', views.user_list),
]

views函数文件

# -*- coding:utf-8 -*-
# Create your views here.
from django.shortcuts import render,HttpResponse
import re
from django import forms  #导入form
from django.core.exceptions import ValidationError  #导入异常类型ValidationError--验证错误

# Form的作用:
# 1、生成html标签
# 2、验证用户输入的有效性

#验证用户输入的手机号码是否符合正则表达式的规则
def mobile_validate(value):
    mobile_re = re.compile(r"^1[3|4|5|8][0-9]\d{8}$")  #正则表达式
    if not mobile_re.match(value):  #如果不符合规则,提示“手机号码格式错误”
        raise ValidationError('手机号码格式错误')

# def mobile_validate(value):
#     mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
#     if not mobile_re.match(value):
#         raise ValidationError('手机号码格式错误')


class userinfo(forms.Form):  #创建一个类,继承forms.Form累 (相当于sql的创建表结构)
    user_type_choice={
        (0,"普通用户"), #普通用户是在页面显示的内容,value对应的是0
        (1,"高级用户"),  #定义下拉框的下拉选项option
    }
    user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,
                                                               attrs={"class":"form-control"}
    ))  #添加select下拉框

    host = forms.CharField(error_messages={"required":u"主机不能为空"})  #默认必选  字符类型
     #这里改变默认的错误提示语,改成自定义的错误提示语(非空的)
    port = forms.CharField(error_messages={"required":u"端口不能为空"})   #字符类型
    email = forms.EmailField(required=False)  #非必选  邮箱类型
    mobile = forms.CharField(validators=[mobile_validate,],  #将手机格式验证函数名字添加到这个列表中
                            error_messages={"required":u"手机不能为空"},  #当输入框不输入的时候,提示不能为空
                             widget=forms.TextInput(attrs={"class":"form-control", #给输入框加上默认的提示语(添加自定义属性)
                                                           "placeholder":"手机号码"}))
    #"class":"form-control"  这个class样式在前端的html定义后,就应用上了 必如字体红色,背景色
    #这里也可以在html中引用bootstrap样式
    memo = forms.CharField(required=False,  #备注可以为空
                             widget=forms.Textarea(attrs={"class":"form-control", #给输入框加上默认的提示语(添加自定义属性)
                                                           "placeholder":"备注"}))

def user_list(request):
    obj = userinfo() #创建对象  (相当于sql的创建一条记录)
    if request.method=="POST": #如果方法是POST,代表是提交数据,POST必须大写
        user_input_obj = userinfo(request.POST) #把用户输入的内容-request.POST(主机,端口,邮箱,手机)作为参数传到userinfo类
        # 封装到对象user_input_obj中
        # print(user_input_obj.is_valid()) #判断用户输入的是是否符合必选、非必选规则,符合就是True;不符合就是false
        if user_input_obj.is_valid():  #如果合法,获取用户输入
            data=user_input_obj.clean()  #后台通过对象获取用户输入的数据
            print(data) #{'port': '223', 'host': '123', 'email': '123@qq.com', 'mobile': '12'}
            # 正常提交后,后台就拿到数据了
        else: #如果不合法,提示错误信息
            error_msg=user_input_obj.errors  #捕捉错误
            print(error_msg)  #后台console打印错误信息
            return render(request,"user_list.html",{"obj":user_input_obj,"errors":error_msg})
        #  前台打印错误信息--把错误信息嵌套到前台的html文件中

    # host=request.POST.get["host"]  #获取请求中用户输入的主机名字 name
    # port=request.POST.get["port"]  #获取请求中用户输入的端口号
    # email=request.POST.get["email"]  #获取请求中用户输入的端口号 name
    # mobile=request.POST.get["mobile"]  #获取请求中用户输入的端口号
    return render(request,"user_list.html",{"obj":obj})
    #将html文件返回到前台展示

    #输入不能为空(必选项不能为空,非必选项可以为空)
    # email =17137737137 (邮箱合法性验证)
    # mobile =789456455   (手机号码合法性验证)
    # mobile =789456455   (IP地址合法性验证)

# 1、基础
#    1、表单验证
#    2、快速生成html标签
# 2、定制化
#    1、错误信息是写死的,搞成自定义的错误信息
#       1、非空-required
#       2、加上自定义属性--输入框的默认提示语
#       3、添加备注-textarea大的文本输入框
#       4、正则表达式验证手机号码格式
#       5、输入框input-ok  大的文本框-textarea-ok 下拉框-select
#       6、js可以写正则判断;后端的django也可以写正则判断
#    2、表单验证步骤:
#       1、创建类,这个累继承forms.Form
#       2、前台页面根据类的对象自动创建html标签
#       3、提交 request.POST包含了用户输入的所有内容
#          把用户输入封装到类的一个对象中obj=userinfo(request.POST)
#       4、用户输入是否合法
#          obj.is_valid()
#       5、如果全部合法
#          obj.clean()  获取用户输入的所有内容
#       6、如果存在不合法
#          obj.errors  拿到错误信息,在前台打印出来
#       7、添加select等插件、正则验证、设置自定义属性
#       8、html相关问题
#          #"class":"form-control"  这个class样式在前端的html定义后,就应用上了 比如字体红色,背景色
#          #这里也可以在html中引用bootstrap样式
#          #html文件中上述几行都是通过对象生成的,也可以直接写html

 

数据库增删改查models
1、创建类
2、配置(将app01加入到配置文件)
setting.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
"app01",
]
3、使用命令根据类创建表
  python manage.py makemigrations --创建生成配置文件
  python manage.py migrate --根据配置文件操作数据库(创建数据库相关东西)

 

posted @ 2016-05-05 19:14  王同佩  阅读(192)  评论(0)    收藏  举报