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