Python的WEB框架有Django、Tornado、Flask等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。今天就一起来学习下Django;
	  1.准备工作
	  使用pip安装:pipinstallDjango
	  2.基本配置
	  1)创建django程序
	  a.终端命令:django-adminstartprojectmysite,IDE创建django程序时,本质上都是自动执行上述命令
	  2)目录结构如下:
	  3)配置文件--(settings.py)

	  a.数据库
	  b.模板
	  c.静态文件
	  3.创建App
	  a.命令
	  pythonmanage.pystartappcmdb
	  b.cmdb目录结构如下:
	  4.登录实例
	  a.templates目录下生成html文件,如login.html
	  <!DOCTYPEhtml>
	  <htmllang="en">
	  <head>
	  <metacharset="UTF-8">
	  <title>登录</title>
	  </head>
	  <body>
	  <formaction='/login/'method='POST'>
	  <p>
	  <inputtype="text"name="user"placeholder="用户名"/>
	  </p>
	  <p>
	  <inputtype="password"name="pwd"placeholder="密码"/>
	  </p>
	  <p>
	  男:<inputtype="radio"name="sex"value="男"/>
	  女:<inputtype="radio"name="sex"value="女"/>
	  </p>
	  <p>
	  <inputtype="submit"value="提交"/>
	  </p>
	  </form>
	  </body>
	  </html>
	  b.修改url文件,定义路由规则
	  fromdjango.contribimportadmin
	  fromdjango.conf.urlsimporturl
	  fromcmdbimportviews
	  urlpatterns=[
	  url(r'^admin/',admin.site.urls),
	  url(r'^login/',views.login),
	  ]
	  c.定义视图函数:app下views.py
	  fromdjango.shortcutsimportrender
	  fromdjango.shortcutsimportHttpResponse
	  fromdjango.shortcutsimportredirect
	  #Createyourviewshere.
	  USER_LIST={}
	  deflogin(request):
	  ifrequest.method=='GET':#判断请求方式
	  returnrender(request,'login.html')
	  elifrequest.method=='POST':
	  user=request.POST.get('user')#post请求,单选、输入框获取值
	  pwd=request.POST.get('pwd')
	  sex=request.POST.get('sex')
	  ifuserandpwd:
	  USER_LIST['name']=user
	  USER_LIST['pwd']=pwd
	  USER_LIST['sex']=sex
	  returnrender(request,'success.html',{"user_list":USER_LIST})
	  else:
	  returnHttpResponse('请求不能为空')
	  else:
	  returnHttpResponse('请求方式不是get\post')#HttpResponse("字符串")
	  d.提交成功后,success.html页面取值,hmtl模板获取字典数据
	  <!DOCTYPEhtml>
	  <htmllang="en">
	  <head>
	  <metacharset="UTF-8">
	  <title>登录成功页面</title>
	  </head>
	  <body>
	  {{user_list.name}}#获取字典中某个key的值
	  <ul>
	  {%fork,vinuser_list.items%}#循环字典
	  <li>{{k}}:{{v}}</li>
	  {%endfor%}
	  </ul>
	  </body>
	  </html>
	  e.通过浏览器访问:http://127.0.0.1:8000/login/,显示login.html登录页面,输入登录信息,登录成功后,获取的数据如下
	  总结:通过上面的例子,我们可以知道django的生命周期:
	  ---->URL对应关系(匹配)--->视图函数--->返回用户字符串
	  ---->URL对应关系(匹配)--->视图函数--->打开一个HTML文件,读取内容
	  5.其他
	  request.GET.get('',None)#获取get请求发来的数据
	  request.POST.get('',None)#获取post请求发来的数据
	  returnrender(request,'HTML模板的路径')
	  returnredirect('只能填写URL')
	  对应多选框、上传文件怎么获取值呢?
	  a.多选框,html格式如下:
	  multiple="multiple"表示多选
	  <p>
	  <selectname="city"multiple="multiple">
	  <optionvalue="bj">北京</option>
	  <optionvalue="sh">上海</option>
	  <optionvalue="sz">深圳</option>
	  </select>
	  </p>
	  views视图页面:
	  city=request.POST.getlist('city')
	  页面访问结果:
	  b.上传文件
	  主要方法
	  文件对象=request.FILES.get('xx')
	  文件名=文件对象.name
	  文件大小=文件对象.size
	  文件内容=文件对象.chunks()
	  html格式,form表单需要添加属性:
	  enctype="multipart/form-data"
	  <p>
	  <inputtype="file"name="upload"/>
	  </p>
	  views视图:
	  #上传文件
	  upload_file_obj=request.FILES.get('upload')
	  print(type(upload_file_obj),upload_file_obj)#<class'django.core.files.uploadedfile.InMemoryUploadedFile'>2.jpg
	  #保存上传的文件到upload目录
	  upload_path=os.path.join('upload',upload_file_obj.name)
	  fw=open(upload_path,'wb')
	  forlineinupload_file_obj.chunks():#chunks表示所有的数据库,是个迭代器
	  fw.write(line)
	  fw.close()
	  页面访问结果:
	  最终的views代码:
	  fromdjango.shortcutsimportrender
	  fromdjango.shortcutsimportHttpResponse
	  fromdjango.shortcutsimportredirect
	  importos
	  #Createyourviewshere.
	  USER_LIST={}
	  deflogin(request):
	  ifrequest.method=='GET':#判断请求方式
	  returnrender(request,'login.html')
	  elifrequest.method=='POST':
	  user=request.POST.get('user')#post请求,单选、输入框获取值
	  pwd=request.POST.get('pwd')
	  sex=request.POST.get('sex')
	  #多选获取值
	  city=request.POST.getlist('city')
	  #上传文件
	  upload_file_obj=request.FILES.get('upload')
	  print(type(upload_file_obj),upload_file_obj)#<class'django.core.files.uploadedfile.InMemoryUploadedFile'>2.jpg
	  #保存上传的文件到upload目录
	  upload_path=os.path.join('upload',upload_file_obj.name)
	  fw=open(upload_path,'wb')
	  forlineinupload_file_obj.chunks():#chunks表示所有的数据库,是个迭代器
	  fw.write(line)
	  fw.close()
	  ifuserandpwd:
	  USER_LIST['name']=user
	  USER_LIST['pwd']=pwd
	  USER_LIST['sex']=sex
	  USER_LIST['city']=city
	  USER_LIST['file']=upload_file_obj.name
	  returnrender(request,'success.html',{"user_list":USER_LIST})
	  else:
	  returnHttpResponse('请求不能为空')
	  else:
	  returnHttpResponse('请求方式不是get\post')#HttpResponse("字符串")
	  6.基于正则表达式的URL
	  简单例子如下:
	  a.修改url文件,定义路由规则
	  urlpatterns=[
	  #url(r'^admin/',admin.site.urls),
	  #url(r'^login/',views.login),
	  url(r'^index/',views.index),
	  url(r'^detail/',views.detail),
	  ]
	  b.视图views
	  USER_DICT={
	  "1":{"name":"root1","email":"qwe1@163.com"},
	  "2":{"name":"root2","email":"qwe2@163.com"},
	  "3":{"name":"root3","email":"qwe3@163.com"},
	  "4":{"name":"root4","email":"qwe4@163.com"},
	  }
	  defindex(request):
	  returnrender(request,'index.html',{"user_dict":USER_DICT})
	  c.模板index.html,循环字典信息
	  点击任意信息可跳转到detail?nid=x页面,获取详细信息
	  <!DOCTYPEhtml>
	  <htmllang="en">
	  <head>
	  <metacharset="UTF-8">
	  <title>index</title>
	  </head>
	  <body>
	  <ul>
	  {%fork,vinuser_dict.items%}
	  <li><atarget="_blank"href="/detail?nid={{k}}">{{v.name}}</a></li>
	  {%endfor%}
	  </ul>
	  </body>
	  </html>
	  d.浏览器访问http://127.0.0.1:8000/index/,页面如下:
	  e.点击页面上任意信息,可以跳转到detail详细页面,detail页面的views视图
	  defdetail(request):
	  nid=request.GET.get('nid')#get请求方式,或者到nid的值,即USER_DICT的key
	  detail_info=USER_DICT[nid]
	  returnrender(request,'detail.html',{"detail_info":detail_info})
	  f.detail.html模板信息如下:
	  <!DOCTYPEhtml>
	  <htmllang="en">
	  <head>
	  <metacharset="UTF-8">
	  <title>详情页面</title>
	  </head>
	  <body>
	  <h1>详细信息</h1>
	  <h6>用户名:{{detail_info.name}}</h6>
	  <h6>邮箱:{{detail_info.email}}</h6>
	  </body>
	  </html>
	  g.点击root2超链接,跳转到另一个页面,如下:
	  7.一类url方式的优化
	  以上上方的detail页面get请求时,使用的形式是http:127.0.0.1:80/detail?nid=x方式,nid的是动态获取,若觉得改方式比较low,可以更改为以下方式:
	  http://127.0.0.1:80/detail-x.html
	  a.url的优化写法
	  b.views的优化写法
	  c.html模板的优化写法
	  d.浏览页面访问效果
	  8.若urls进行了变更,那么涉及的urls也需要改动,多次变更后,可能修改就会有遗漏,有什么高效的解决方法吗?
	  a.找到urls.py文件,修改路由规则
	  #url(r'detail/',views.detail),
	  #url(r'detail-(\d+).html/',views.detail),#正则表达式
	  url(r'detail-(\d+).html/',views.detail,name='detail_name'),#正则表达式
	  b,找到views文件,进行修改
	  defindex(request):
	  #returnHttpResponse('index')
	  returnrender(request,'index.html',{"user_dict":USER_DICT})
	  #defdetail(requerst):
	  #nid=requerst.GET.get('nid')
	  #detail_info=USER_DICT[nid]
	  #returnrender(requerst,'detail.html',{"detail_info":detail_info})
	  defdetail(requerst,nid):#nid指定的是(\d+)里的内容
	  detail_info=USER_DICT[nid]
	  returnrender(requerst,'detail.html',{"detail_info":detail_info})
	  c.在templates目录下的index.html
	  <!DOCTYPEhtml>
	  <htmllang="en">
	  <head>
	  <metacharset="UTF-8">
	  <title>字典循环获取</title>
	  </head>
	  <body>
	  {{user_dict.KEY1}}
	  <!--
	  <ul>
	  {%fork,vinuser_dict.items%}
	  <li><atarget="_blank"href="/detail?nid={{k}}">{{v.name}}</a></li>
	  {%endfor%}
	  </ul>
	  <ul>
	  {%fork,vinuser_dict.items%}
	  <li><atarget="_blank"href="/detail-{{k}}.html">{{v.name}}</a></li>
	  {%endfor%}
	  </ul>
	  -->
	  <ul>
	  {%fork,vinuser_dict.items%}
	  <li><atarget="_blank"href="{%url"detail_name"k%}">{{v.name}}</a></li>
	  {%endfor%}
	  </ul>
	  </body>
	  </html>
	  d.页面访问
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h54670.shtml








