欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django基础使用

程序员文章站 2022-05-26 15:17:08
Python的WEB框架有Django、Tornado、Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。今天就一起来学习下Django; 1. 准备工作 使用pip安装: pip install Djan ......

 

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)目录结构如下:

Django基础使用

3)配置文件 --  (settings.py)

    a. 数据库

   Django基础使用

   b. 模板

  Django基础使用

  c. 静态文件

   Django基础使用

3. 创建app

    a. 命令 

        python manage.py startapp cmdb

       Django基础使用

    b. cmdb 目录结构如下:

    Django基础使用

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基础使用

总结:通过上面的例子,我们可以知道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')

页面访问结果:

Django基础使用

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()

页面访问结果:

Django基础使用

 最终的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. 浏览器访问  , 页面如下: 

Django基础使用

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超链接,跳转到另一个页面,如下:

Django基础使用

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的优化写法

Django基础使用

b.views的优化写法

Django基础使用

c. html模板的优化写法

Django基础使用

d. 浏览页面访问效果

Django基础使用