Python笔记:Django框架中上传文件、数据分页、部署(Apache)

上传图片

  • 当Django在处理文件上传的时候,文件数据被保存在request.FILES
  • FILES中的每个键为<input type="file" name="" />中的name
  • 注意:FILES只有在请求的方法为POST 且提交的<form>带有enctype="multipart/form-data" 的情况下才会包含数据。
  • 否则,FILES 将为一个空的类似于字典的对象
  • 备注:本文基于django版本1.11展开, 技术栈会有所升级, 仅供参考!

1 ) 自定义上传的模板代码

<html>
<head>
    <title>文件上传</title>
</head>
<body>
    <form method="post" action="upload/" enctype="multipart/form-data">
        <input type="text" name="title"><br>
        <input type="file" name="pic"/><br>
        <input type="submit" value="上传">
    </form>
</body>
</html>

2 ) 自定义上传的视图代码

from django.shortcuts import render
from django.http import HttpResponse
from PIL import Image
import time,os

def upload(request):
    '''执行图片的上传'''
    myfile = request.FILES.get("mypic",None)
    if not myfile:
        return HttpResponse("没有上传文件信息")
    filename = str(time.time())+"."+myfile.name.split('.').pop()
    destination = open("./static/pics/"+filename,"wb+")
    for chunk in myfile.chunks():      # 分块写入文件  
        destination.write(chunk)  
    destination.close()

    # 执行图片缩放
    im = Image.open("./static/pics/"+filename)
    # 缩放到75*75(缩放后的宽高比例不变):
    im.thumbnail((75, 75))
    # 把缩放后的图像用jpeg格式保存: 
    im.save("./static/pics/s_"+filename,None)

    #执行图片删除
    #os.remove("./static/pics/"+filename)

    return HttpResponse("上传成功!图片:"+filename)

3 ) 使用模型处理上传文件

  • 将属性定义成models.ImageField类型 pic=models.ImageField(upload_to='cars/')
  • 注意:如果属性类型为ImageField获使用图片处理,那么就需要安装包Pillow $ pip3 install Pillow
  • 图片存储路径
    • 在项目根目录下创建media文件夹
    • 图片上传后,会被保存到“/static/media/cars/图片文件”
    • 打开settings.py文件,增加media_root项
      MEDIA_ROOT=os.path.join(BASE_DIR,"static/media")
      
  • 使用django后台管理,遇到ImageField类型的属性会出现一个file框,完成文件上传

分页操作

  • Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中

Paginator对象

  • Paginator(列表,int):返回分页对象,参数为列表数据,每面数据的条数
  • 属性
    • count:对象总数
    • num_pages:页面总数
    • page_range:页码列表,从1开始,例如[1, 2, 3, 4]
  • 方法
    • page(num):下标以1开始,如果提供的页码不存在,抛出InvalidPage异常
  • 异常exception
    • InvalidPage:当向page()传入一个无效的页码时抛出
    • PageNotAnInteger:当向page()传入一个不是整数的值时抛出
    • EmptyPage:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出

Page对象

  • 创建对象

    • Paginator对象的page()方法返回Page对象,不需要手动构造
  • 属性

    • object_list:当前页上所有对象的列表
    • number:当前页的序号,从1开始
    • paginator:当前page对象相关的Paginator对象
  • 方法

    • has_next():如果有下一页返回True
    • has_previous():如果有上一页返回True
    • has_other_pages():如果有上一页或下一页返回True
    • next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常
    • previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
    • len():返回当前页面对象的个数
      迭代页面对象:访问当前页面中的每个对象

示例代码

  • 创建视图pagTest

    from django.core.paginator import Paginator
    
    def pagTest(request, pIndex):
        list1 = AreaInfo.objects.filter(aParent__isnull=True)
        p = Paginator(list1, 10)
        if pIndex == '':
            pIndex = '1'
        pIndex = int(pIndex)
        list2 = p.page(pIndex)
        plist = p.page_range
        return render(request, 'booktest/pagTest.html', {'list': list2, 'plist': plist, 'pIndex': pIndex})
    
  • 配置url url(r'^pag(?P<pIndex>[0-9]*)/$', views.pagTest, name='pagTest'),

  • 定义模板pagTest.html

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
    </head>
    <body>
    <ul>
    {%for area in list%}
    <li>{{area.id}}--{{area.atitle}}</li>
    {%endfor%}
    </ul>
    
    {%for pindex in plist%}
    {%if pIndex == pindex%}
    {{pindex}}&nbsp;&nbsp;
    {%else%}
    <a href="/pag{{pindex}}/">{{pindex}}</a>&nbsp;&nbsp;
    {%endif%}
    {%endfor%}
    </body>
    </html>
    

Django部署(Apache)

  • 使用python3 manage.py runserver来运行服务器,这只适用测试环境中使用。
  • 正式发布的服务,我们需要一个可以稳定而持续的服务器,比如Apache, Nginx, IIS等,本文将以Apache为例。
  • 使用Apache和mod_wsgi部署Django, 是一种久经考验的将Django投入生产的方法。
  • mod_wsgi是一个Apache模块, 可以托管任何Python WSGI应用程序, 包括Django。
  • Django将使用任何支持mod_wsgi的Apache版本。

配置步骤

  • Apache2安装

    Apache2安装
    sudo apt-get install apache2
    
    # 查看版本
    apachectl -v
    Server version: Apache/2.4.18 (Ubuntu)
    Server built: 2017-09-18T15:09:02
    
  • 确保有127.0.0.1 localhost,没有就加上

    sudo vim /etc/hosts
    
    127.0.0.1       localhost
    127.0.0.1       www.pyweb.cn
    
  • 打开浏览器 输入 127.0.0.1或localhost

    • 出现 Apache2 Ubuntu Default Page
    • 或It works! 则成功
  • 安装apache2解析python的包 wsgi程序包

    • $ sudo apt-get install libapache2-mod-wsgi-py3
    • 安装完成后 进入 /usr/lib/apache2/modules 目录
    • cd /usr/lib/apache2/modules
    • 查看是否存在mod_wsgi.so-3.5
  • 配置使apache2加载mod-wsgi包

    • 编辑配置文件
    • sudo vim /etc/apache2/apache2.conf
    • 在文件的最后 添加:
    • LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so-3.5
  • 创建网站配置文件

    # 编辑网站配置文件
    sudo vim /etc/apache2/sites-available/myproject.conf
    
    # 配置内容:
    <VirtualHost *:80>
    ServerName www.pyweb.cn
    ServerAdmin py@163.cn
    #wsgi文件目录
    WSGIDaemonProcess python-path=/var/www/myproject
    WSGIScriptAlias / /var/www/myproject/myproject/wsgi.py
    <Directory /var/www/myproject/myproject>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
    #项目文件目录
    DocumentRoot /var/www/myproject
    <Directory /var/www/myproject>
        Require all granted
    </Directory>
    #静态文件目录
    Alias /static/ /var/www/myproject/static/
    <Directory /var/www/myproject/static/>
        Require all granted
    </Directory>
    #错误日志
    ErrorLog ${APACHE_LOG_DIR}/django-myproject-error.log
    CustomLog ${APACHE_LOG_DIR}/myproject-django.log combined
    </VirtualHost>
    
  • 将当前的配置文件创建一个软连接到/etc/apache2/sites-enabled

    • $ cd /etc/apache2/sites-enabled
    • $ sudo ln -s ../sites-available/myproject.conf ./
  • 执行命令 生效当前配置

    • $ sudo a2ensite myproject.conf
    • 如果需要让这个配置失效,可以执行 $ sudo a2dissite myproject.conf
  • 配置Django项目目录及修改settings.py文件

    • 首先把myproject项目目录拷贝至 /var/www/目录下
    • 在将其ALLOWED_HOSTS=[]改为
    • ALLOWED_HOSTS=[‘www.pyweb.cn’],多个域名可以通过逗号隔开。
  • 修改Django的wsgi.py文件

    import os
    os.environ["DJANGO_SETTINGS_MODULE"] = "myproject.settings"
    #os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pyjfive.settings")
    
    from os.path import join,dirname,abspath
    PROJECT_DIR = dirname(dirname(abspath(__file__)))
    
    import sys # 4
    sys.path.insert(0,PROJECT_DIR)
    
    
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
    
  • 重启apache2, $ sudo service apache2 restart

  • 浏览器访问, $ http://www.pyweb.cn/

  • 浏览器错误 500

    Internal Server Error
    The server encountered an internal error or misconfiguration and was unable to complete your request.
    Please contact the server administrator at [no address given] to inform them of the time this error occurred,
    and the actions you performed just before this error.
    More information about this error may be available in the server error log.
    Apache/2.4.18 (Ubuntu) Server at www.py6web.com Port 80
    
  • 查看apache2的错误日志

    cd /var/log/apache2/
    
    File "/var/www/myproject-test/myproject/wsgi.py", line 17, in <module>, referer: http://www.pyweb.com/
    from django.core.wsgi import get_wsgi_application, referer: http://www.pyweb.com/
    ImportError: No module named 'django', referer: http://www.pyweb.com/
    
  • 问题分析

    进入项目目录,使用命令 pip3 show Djando 查看当前是否已经安装django
    ---
    Metadata-Version: 1.1
    Name: Django
    Version: 1.11.8
    
    切换至root用户 sudo su 
    
    # 进入python3的shell模式
    python3
    #加载django模块
    import django
    #错误:No module named 'django'
    
  • 解决方案

    # 在当前root用户下 安装django
    sudo su
    pip3 install django==1.11
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值