Django基础使用
python的web框架有django、tornado、flask 等多种,django相较与其他web框架其优势为:大而全,框架本身集成了orm、模型绑定、模板引擎、缓存、session等诸多功能。今天就一起来学习下django;
1. 准备工作
使用pip安装: pip install django
2. 基本配置
1)创建django程序
a. 终端命令: django-admin startproject mysite , ide创建django程序时,本质上都是自动执行上述命令
2)目录结构如下:
3)配置文件 -- (settings.py)
a. 数据库
b. 模板
c. 静态文件
3. 创建app
a. 命令
python manage.py startapp cmdb
b. cmdb 目录结构如下:
4. 登录实例
a. templates目录下生成html文件,如login.html
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>登录</title> </head> <body> <form action='/login/' method='post'> <p> <input type="text" name="user" placeholder="用户名"/> </p> <p> <input type="password" name="pwd" placeholder="密码"/> </p> <p> 男:<input type="radio" name="sex" value="男"/> 女:<input type="radio" name="sex" value="女"/> </p> <p> <input type="submit" value="提交"/> </p> </form> </body> </html>
b. 修改url文件,定义路由规则
from django.contrib import admin from django.conf.urls import url from cmdb import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), ]
c. 定义视图函数:app下views.py
from django.shortcuts import render from django.shortcuts import httpresponse from django.shortcuts import redirect # create your views here. user_list = {} def login(request): if request.method == 'get': #判断请求方式 return render(request, 'login.html') elif request.method == 'post': user = request.post.get('user') #post请求,单选、输入框获取值 pwd = request.post.get('pwd') sex = request.post.get('sex') if user and pwd: user_list['name'] = user user_list['pwd'] = pwd user_list['sex'] = sex return render(request, 'success.html', {"user_list": user_list}) else: return httpresponse('请求不能为空') else: return httpresponse('请求方式不是get\post') #httpresponse("字符串")
d. 提交成功后,success.html页面 取值, hmtl模板获取 字典数据
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>登录成功页面</title> </head> <body> {{ user_list.name}} #获取字典中某个key的值 <ul> {% for k,v in user_list.items %} #循环字典 <li>{{ k }} : {{ v }}</li> {% endfor %} </ul> </body> </html>
e. 通过浏览器访问: ,显示login.html登录页面,输入登录信息,登录成功后,获取的数据如下
总结:通过上面的例子,我们可以知道django的生命周期:
---->url对应关系(匹配) --->视图函数 --->返回用户字符串
----> url对应关系(匹配) --->视图函数 --->打开一个html文件,读取内容
5. 其他
request.get.get('',none) #获取get请求发来的数据 request.post.get('',none) #获取post请求发来的数据 return render(request, 'html模板的路径') return redirect('只能填写url')
对应多选框、上传文件怎么获取值呢?
a. 多选框,html格式如下:
multiple="multiple" 表示多选
<p> <select name="city" multiple="multiple"> <option value="bj" >北京</option> <option value="sh" >上海</option> <option value="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> <input type="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') for line in upload_file_obj.chunks(): #chunks表示所有的数据库,是个迭代器 fw.write(line) fw.close()
页面访问结果:
最终的views代码:
from django.shortcuts import render from django.shortcuts import httpresponse from django.shortcuts import redirect import os # create your views here. user_list = {} def login(request): if request.method == 'get': #判断请求方式 return render(request, 'login.html') elif request.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') for line in upload_file_obj.chunks(): #chunks表示所有的数据库,是个迭代器 fw.write(line) fw.close() if user and pwd: user_list['name'] = user user_list['pwd'] = pwd user_list['sex'] = sex user_list['city'] = city user_list['file'] = upload_file_obj.name return render(request, 'success.html', {"user_list": user_list}) else: return httpresponse('请求不能为空') else: return httpresponse('请求方式不是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"}, } def index(request): return render(request, 'index.html', {"user_dict":user_dict})
c. 模板 index.html ,循环字典信息
点击任意信息可跳转到detail?nid=x页面,获取详细信息
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>index</title> </head> <body> <ul> {% for k,v in user_dict.items %} <li><a target="_blank" href="/detail?nid={{ k }}">{{ v.name }}</a></li> {% endfor %} </ul> </body> </html>
d. 浏览器访问 , 页面如下:
e. 点击页面上任意信息,可以跳转到detail详细页面, detail页面的views视图
def detail(request): nid = request.get.get('nid') #get请求方式,或者到nid的值,即user_dict的key detail_info = user_dict[nid] return render(request, 'detail.html', {"detail_info": detail_info})
f. detail.html模板信息如下:
<!doctype html> <html lang="en"> <head> <meta charset="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. 浏览页面访问效果
下一篇: LVS介绍及相关配置