python+django从mongo读取数据和图片展示在html

8 篇文章 0 订阅
6 篇文章 0 订阅

  • 简述:之前简单笔记了抓取30条某房产中介房源信息和图片存储在mongo:https://blog.csdn.net/qq284489030/article/details/80840994,

  • 目标:现在要实现python+django从mongo读取信息和图片,展示在html页面

  • 版本:python(3.6)+django(2.0)+mongoengine( 0.15.0)

  • 特别说明:只是简单实现目标所述,代码不规范、更好的思路,还请高手指点江山。
  • 思路:
  1. models中建模,对应创建房屋信息collection;
  2. views中获取房屋信息;
  3. views中使用获取该房屋信息对应的图片,将图片保存在本地,并将图片路径添加到房屋信息中;
  4. 使用paginator分页,render传给html
  5. html中加载展示
  • 结构图


  • settings.py文件内容及说明
import mongoengine #ys
from gridfs import *
mongo_con = mongoengine.connect('test7',host='127.0.0.1',port=27017)
mongo_db = mongo_con.test7
fs = GridFS(mongo_db,collection='coll_image')#mongo图片连接
DATABASES = {
    'default': {
        # 'ENGINE': 'mypackage.backends.whatever',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}#注释掉默认数据库连接
#ys 图片路径

STATIC_ROOT = os.path.join(os.path.dirname(__file__),'static')STATIC_ROOT_IMG = os.path.join(os.path.dirname(__file__),'static/images')STATICFILES_DIRS = ( ('css',os.path.join(STATIC_ROOT,'css').replace('\\','/') ), ('js',os.path.join(STATIC_ROOT,'js').replace('\\','/') ), ('images',os.path.join(STATIC_ROOT,'images').replace('\\','/') ), ('upload',os.path.join(STATIC_ROOT,'upload').replace('\\','/') ),) #django静态文件加载路径
  • models.py
from mongoengine import *
from gridfs import *

class test(Document):
    _id = ObjectIdField(required=True)
    title = StringField(required=True)
    address = StringField(required=True)
    flood = StringField(required=True)
    followInfo = StringField(required=True)
    img_url = StringField(required=True)
    img_id = ObjectIdField(required=True)
    # creat_time = DateTimeField(required=True)
    meta = {'collection':'test'} #指明连接的表,各字段对应collection中房屋信息
gridfs bukects中图片暂时没找到建模方式,在views中读取图片到本地
  • views.py
from app_demo.models import test,coll_image #引用models.py中的类
from web_ys.settings import * #引入工程配置文件
from urllib import parse

def index_fenye(request):
    response_dic_context = {}            #{'houses':response_list} ; render 返回字典类型,
    global response_list                #页面上多个房屋信息的列表,每个房屋信息类型是dict
    response_list = []
    for t in test.objects():            #遍历mongo中所有房屋信息
        response_dic = t._data           #每个房屋的所有信息赋值给字典 response_dic
        # t.img_id 是房屋信息中对应的图片存储id,
        # 使用setting定义的fs从gridfs bukects中查找id属于该房屋的图片
        for img_img in fs.find({'_id': t.img_id}, no_cursor_timeout=True):
            # 拼接 存放数据库生成图片的本地路径
            img_path = (STATICFILES_DIRS[2][1] + '/' + str(t.img_id) + '.jpg').replace('/', '\\')
            # 读取并保存图片到本地路径下
            with open(img_path, mode='wb') as f:
                f.write(img_img.read())
                f.flush()
                f.close()
            # 图片相对路径,添加到房屋信息字典中,在html加载
            response_dic['image'] = 'images/' + str(t.img_id) + '.jpg'
            response_list.append(response_dic)
        response_dic_context['houses'] = response_list

    contact_list = response_list #开始没用分页,直接render中返回response_dic_context;后来添加了分页
    paginator = Paginator(contact_list, 8)  # 每页显示数目

    page = request.GET.get('page')
    try:
        contacts = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        contacts = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        contacts = paginator.page(paginator.num_pages)

    return render(request, 'index_fenye.html', {'contacts': contacts})
  • index_fenye.html
<html>
<head>
<title>Django Page Title</title>
</head>
<body>
        <form method="get">
{#        staticfiles 加载静态资源#}
        {% load staticfiles %}
{#                遍历返回的当前页的所有房屋资料#}
                {% for d  in contacts %}
{#                    遍历每个房屋信息中的每条信息#}
                    {% for k,v in d.items %}
                        {% ifequal k "title" %}
                            <div>【title】: {{ v }} </div>
                        {% endifequal %}

                        {% ifequal k "address" %}
                            <div>【address】: {{ v }} </div>
                        {% endifequal %}

                        {% ifequal k "flood" %}
                            <div>【flood】: {{ v }} </div>
                        {% endifequal %}

                        {% ifequal k "followInfo" %}
                            <div>【followInfo】: {{ v }} </div>
                        {% endifequal %}

                        {% ifequal k "img_url" %}
                            <div>【img_url】:{{ v }} </div>
                        {% endifequal %}

                        {% ifequal k "img_id" %}
                            <div>【img_id】: {{ v }} </div>
                        {% endifequal %}

{#                        #特别注意图片路径引用#}
{#                        {% ifequal k "image" %}#}
{#                            【图片】:<image src="{% static v %}"> </image>#}
{#                        {% endifequal %}#}

                        {% ifequal k "image" %}
                            【图片】:<image src="{% static v %}"></image>
                        {% endifequal %}
                    {% endfor %}
                    <ul>-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</ul>
                 {% endfor %}

            <div class="pagination">
                <span class="step-links">
                    {% if contacts.has_previous %}
                        <a href="?page={{ contacts.previous_page_number }}">previous </a>
                    {% endif %}

                    <span class="current">
                        Page {{ contacts.number }} of {{ contacts.paginator.num_pages }}.
                    </span>

                    {% if contacts.has_next %}
                        <a href="?page={{ contacts.next_page_number }}">next </a>
                    {% endif %}
                </span>
            </div>
        {% csrf_token %}
        </form>
</body>
</html>
  • 效果

项目上传到 https://download.csdn.net/download/qq284489030/10535190


  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Python Django 疫情数据平台设计可以从以下几个方面进行考虑: 1. 数据采集与处理:利用 Python 进行数据的采集和处理,可以使用爬虫技术从各个官方网站或数据源上获取疫情相关数据,然后通过数据处理清洗,提取出所需的有效信息。 2. 数据存储与管理:使用 Django ORM(对象关系映射)技术,将清洗好的数据存储到数据库。可以选择使用关系型数据库如 MySQL 或 PostgreSQL,也可以考虑使用非关系型数据库如 MongoDB。 3. 用户身份验证与权限控制:在 Django 提供了用户认证和权限控制的功能,可以通过设置登录注册系统来管理用户的访问权限,只允许具备特定权限的用户查看或修改相关数据。 4. 数据可视化与分析:使用可视化库如 Matplotlib、Seaborn 或 Plotly,对疫情数据进行可视化展示,例如绘制曲线图、地图等,方便用户直观地了解疫情发展趋势。 5. 接口开发与数据交互:通过 Django REST framework 构建 API 接口,可以提供给其他系统或移动端应用获取疫情数据,也可以与其他数据源进行数据交互,实现数据的共享和更新。 6. 后台管理与数据维护:利用 Django 提供的后台管理界面,可以方便地管理数据,包括数据的录入、修改、删除等操作。同时,可以定期对数据进行维护,例如数据清洗、备份等,确保数据的完整性和准确性。 总结:通过 Python Django 可以快速高效地开发疫情数据平台,从数据采集、存储、管理到可视化分析和接口开发都有较为成熟的解决方案。这种设计能够满足用户对疫情数据的查看和分析需求,同时提供了数据可视化和数据交互的功能,使得用户能够方便灵活地获取和利用疫情数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

生命的脚步从不停歇

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

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

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

打赏作者

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

抵扣说明:

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

余额充值