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 --根据配置文件操作数据库(创建数据库相关东西)

浙公网安备 33010602011771号