1. 程式人生 > >7 增加圖片喜歡資訊

7 增加圖片喜歡資訊

增加功能

增加使用者頁面

  • /profile handler

class ProfileHandler(AuthBaseHandler):
	"""
	顯示使用者上傳的圖片 和 喜歡的圖片列表
	"""

	@tornado.web.authenticated
	def get(self, *args, **kwargs):
		user = get_user(self.current_user)
		like_post_list = get_like_post(user)
		self.render('profile.html', user=user, like_post_list=
like_post_list)

.card卡片元件(樣式)

  • html 模板
{% extends 'base.html' %}

{% block title %}
    index page
{% end %}

{% block content %}
    <div class="row">
        <div class="card col-12">
            <div class="card-header"><h3>{{ current_user }}使用者上傳</h3></
div
>
{% for post in user.posts %} <div class="col-6 col-sm-3"> <a href="/post/{{ post.id }}"> <img src="{{ static_url(post.thumb_url) }}"> </a> </div> {% end %} </
div
>
<div class="card col-12"> <div class="card-header"><h3>使用者喜歡</h3></div> {% for post in like_post_list %} <a href="/post/{{ post.id }}"> <img src="{{ static_url(post.thumb_url) }}"> </a> {% end%} </div> </div> {% end %}

記錄使用者喜歡的圖片

  • 增加 Like model (記錄哪個使用者 喜歡 哪個圖片)
  class Like(Base):
     """
     記錄使用者喜歡的圖片資訊
     """
     __tablename__ = 'likes'
     user_id = Column(Integer, ForeignKey('users.id'), nullable=False, primary_key=True)
     post_id = Column(Integer, ForeignKey('posts.id'), nullable=False, primary_key=True)
alembic revision --autogenerate -m 'add like model'

alembic upgrade head
  • 資料庫操作

    • 使用者喜歡的哪些圖片
    • 一個圖片有哪些使用者喜歡
  • 增加輔助函式

utils/account

  def get_user(username):
  	"""
  	查詢使用者user
  	:return: 
  	"""
  	user = session.query(Users).filter_by(name=username).first()
  	return user
  
  
  def get_like_post(user):
     """
     查詢使用者user喜歡的圖片的post物件
     :param user:  Users的例項
     :return:  Posts的例項
     """
     # posts = []
     # likes = session.query(Like).filter_by(user_id=user.id).all()
     # for like in likes:
     #  post = session.query(Posts).filter_by(id=like.post_id).first()
     #  posts.append(post)
     posts = session.query(Posts).filter(Like.user_id == user.id, Posts.id == Like.post_id).all()
     return posts
  • like 操作 ajax post

展示在使用者和單獨圖片頁面

  • 讀取資料到 handler
  class PostHandler(AuthBaseHandler):
     """
     詳情頁
     """
  
     @tornado.web.authenticated
     def get(self, post_id):
        post = get_post(post_id)
        if not post:
           self.write('post id is not exists')
        else:
           like_count = get_like_count(post)
           self.render('post.html', post=post, like_count=like_count)
  • 修改 html 模板
    post.html
{% extends 'base.html' %}

{% block title %}
    post page
{% end %}

{% block content %}

    <div class="row">
        <div class="col-sm-8">
            <img src="{{ static_url(post.image_url)}}" width="560">
        </div>
        <div class="col-sm-4">
            upload by {{ post.user.name }}<br>
            {% if like_count %}
                <i class="fa fa-heart text-danger"></i> {{ like_count }}
            {% end %}
        </div>
    </div>
{% end %}

作業

增加使用者頁面和 likes 表,展示圖片的喜歡資訊

程式碼

app.py

import tornado.web
import tornado.options
import tornado.ioloop
from tornado.options import define, options

from handlers import main,auth

define(name='port', default='8000', type=int, help='run port')


class Application(tornado.web.Application):
   def __init__(self):
      handlers = [
         (r'/', main.IndexHandler),
         (r'/explore', main.ExploreHandler),
         (r'/post/(?P<post_id>[0-9]+)', main.PostHandler),
         (r'/upload', main.UploadHandler),
         (r'/profile', main.ProfileHandler),
         (r'/login', auth.LoginHandler),
         (r'/logout', auth.LogoutHandler),
         (r'/signup', auth.SignupHandler),
      ]
      settings = dict(
         debug=True,
         template_path='templates',
         static_path='static',
         login_url='/login',
         cookie_secret='bZJc2sWbQLKos6GkHn/VB9oXwQt8S0R0kRvJ5/xJ89E=',
         pycket={
            'engine': 'redis',
            'storage': {
               'host': 'localhost',
               'port': 6379,
               # 'password': '',
               'db_sessions': 5,  # redis db index
               'db_notifications': 11,
               'max_connections': 2 ** 30,
            },
            'cookies': {
               'expires_days': 30,
            },
         }
      )

      super(Application, self).__init__(handlers, **settings)


application = Application()

if __name__ == '__main__':
   tornado.options.parse_command_line()
   application.listen(options.port)
   print("Server start on port {}".format(str(options.port)))
   tornado.ioloop.IOLoop.current().start()

utils/account.py

import hashlib
from models.account import Users, session, Posts, Like
from datetime import datetime
from sqlalchemy import func


def hashed(passwd):
	return hashlib.md5(passwd.encode('utf8')).hexdigest()


def authenticate(username, password):
	"""
	登入認證
	:param username:
	:param password:
	:return:
	"""
	if username and password:
		# 獲取資料庫中username對應的密碼
		user_passwd = Users.get_passwd(username)
		# 如果使用者存在 密碼匹配
		if user_passwd and user_passwd == hashed(password):
			return True
	return False


def register(username, password, email):
	"""
	註冊
	:param username:
	:param password:
	:param email:
	:return:
	"""
	# 檢視使用者是否存在於資料庫中
	if Users.is_exists(username):
		return {'msg': '使用者已存在'}
	hash_passwd = hashed(password)
	# 新增使用者到資料庫
	Users.add_user(username, hash_passwd, email)
	return {'msg': 'ok'}


def save_last_login(username):
	"""
	# 儲存使用者username最後登入時間
	:param username:
	:return:
	"""
	t = datetime.now()
	print("user {} login at {}".format(username, t))
	session.query(Users).filter_by(name=username).update({Users.last_login: t})
	session.commit()


def get_post_for(username):
	"""
	獲取使用者上傳的圖片資訊
	:param username:
	:return:
	"""
	user = session.query(Users).filter_by(name=username).first()
	if user:
		return user.posts
	else:
		return []


def get_post_all():
	"""
	獲取所有圖片資訊(降序)
	:return:
	"""
	post_list = session.query(Posts).order_by(Posts.id.desc()).all()
	return post_list


def get_post(post_id):
	"""
	獲取使用者的特定圖片
	:param post_id:
	:return:
	"""
	post = session.query(Posts).filter_by(id=post_id).first()
	return post


def get_user(username):
	"""
	查詢使用者user
	:return:
	"""
	user = session.query(Users).filter_by(name=username).first()
	return user


def get_like_post(user):
	"""
	查詢使用者user喜歡的圖片的post物件
	:param user:  Users的例項
	:return:  Posts的例項
	"""
	# posts = []
	# likes = session.query(Like).filter_by(user_id=user.id).all()
	# for like in likes:
	# 	post = session.query(Posts).filter_by(id=like.post_id).first()
	# 	posts.append(post)

	# 去除使用者自己上傳的圖片
	posts = session.query(Posts).filter(Like.user_id == user.id, Posts.id == Like.post_id,
										Posts.user_id != user.id).all()
	return posts


def get_like_count(post):
	"""

	:param post:
	:return:
	"""
	like_count = session.query(Like).filter_by(post_id=post.id).count()
	return like_count

models/account.py

from sqlalchemy import (Column, Integer, String, DateTime, ForeignKey)
from sqlalchemy import exists
from sqlalchemy.orm import relationship
from sqlalchemy.sql import exists

from .db import Base, DBSession

from datetime import datetime

session = DBSession()


class Users(Base):
	__tablename__ = 'users'

	id = Column(Integer, primary_key=True, autoincrement=True)
	name = Column(String(50), unique=True, nullable=False)
	password = Column(String(50), nullable=False)
	created = Column(DateTime, default=datetime.now)
	email = Column(String(50))
	last_login = Column(DateTime)

	def __repr__(self):
		return '<User(#{}:{})>'.format(self.id, self.name)

	# 增加使用者到資料庫中
	@classmethod
	def add_user(cls, username, password, email=''):
		user = Users(name=username, password=password, email=email, last_login=datetime.now())
		session.add(user)
		session.commit()

	# 查詢使用者username對應的密碼
	@classmethod
	def get_passwd(cls, username):
		user = session.query(Users).filter_by(name=username).first()
		# 如果使用者存在 返回密碼
		if user:
			return user.password
		# 使用者不存在 返回空
		else:
			return ''

	# 判斷使用者是否存在於資料庫中
	@classmethod
	def is_exists(cls, username):
		ret = session.query(exists().where(Users.name == username)).scalar()
		return ret


class Posts(Base):
	"""
	使用者圖片資訊
	"""
	__tablename__ = 'posts'
	id = Column(Integer, primary_key=True, autoincrement=True)
	image_url = Column(String(100))  # 大圖路徑
	thumb_url = Column(String(100))  # 縮圖路徑
	user_id = Column(Integer, ForeignKey('users.id'))
	# Post 有user屬性 存放Users物件 , Users有posts屬性 存放Posts物件
	user = relationship('Users', backref='posts', uselist=False, cascade='all')

	# 儲存使用者上傳的圖片資訊  圖片和特定的使用者建立關係(這張圖片是由這個使用者傳上來的)
	@classmethod
	def add_post_for(cls, username, image_url, thumb_url):
		user = session.query(Users).filter_by(name=username).first()
		post = Posts(image_url=image_url, thumb_url=thumb_url, user=user)
		session.add(post)
		session.commit()
		return post


class Like(Base):
	"""
	記錄使用者喜歡的圖片資訊
	"""
	__tablename__ = 'likes'
	user_id = Column(Integer, ForeignKey('users.id'), nullable=False, primary_key=True)
	post_id = Column(Integer, ForeignKey('posts.id'), nullable=False, primary_key=True)


if __name__ == '__main__':
	Base.metadata.create_all()

main.py

import tornado.web
from utils import photo
from models.account import Posts
from pycket.session import SessionMixin
from utils.account import get_post_for, get_post, get_post_all, get_user, get_like_post, get_like_count
from utils.photo import ImageSave
import os


class AuthBaseHandler(tornado.web.RequestHandler, SessionMixin):
	def get_current_user(self):
		return self.session.get('tudo_user_info')


class IndexHandler(AuthBaseHandler):
	"""
	首頁
	"""

	@tornado.web.authenticated
	def get(self, *args, **kwargs):
		post_list = get_post_for(self.current_user)
		self.render('index.html', post_list=post_list)


class ExploreHandler(AuthBaseHandler):
	"""
	發現頁
	"""

	@tornado.web.authenticated
	def get(self, *args, **kwargs):
		post_list = get_post_all()
		self.render('explore.html', post_list=post_list, current_user=self.current_user)


class PostHandler(AuthBaseHandler):
	"""
	詳情頁
	"""

	@tornado.web.authenticated
	def get(self, post_id):
		post = get_post(post_id)
		if not post:
			self.write('post id is not exists')
		else:
			like_count = get_like_count(post)
			self.render('post.html', post=post, like_count=like_count)


class UploadHandler(AuthBaseHandler):
	"""
		接受圖片上傳
		"""

	@tornado.web.authenticated
	def get(self, *args, **kwargs):
		self.render('upload.html')

	def post(self, *args, **kwargs):
		# 提取表單中‘name’為‘newimg’的檔案元資料   獲取上傳檔案資訊
		img_files = self.request.files.get('newimg')

		if img_files:
			post_id = 0
			for img in img_files:
				# 儲存的圖片的目錄 名字
				image_saver = ImageSave(self.settings['static_path'], img['filename'])
				# 儲存圖片
				image_saver.save_image(img['body'])

				# 生成縮圖  ./ static / uploads /thumbs/ 701728_200x200.jpg
				image_saver.make_thumbs()

				# 儲存圖片的使用者 大圖地址 縮圖地址  把url存到資料庫
				post = Posts.add_post_for(self.current_user, image_saver.image_url, image_saver.thumb_url)
				post_id = post.id

			self.redirect('post/{}'.format(post_id))
		else:
			self.write({'msg': 'empty form data'}
            
           

相關推薦

7 增加圖片喜歡資訊

增加功能 增加使用者頁面 /profile handler class ProfileHandler(AuthBaseHandler): """ 顯示使用者上傳的圖片 和 喜歡的圖片列表 """ @tornado.web.authenticated d

_ZNote_Qt_按鈕增加圖片

設置 邊框 ndb 顯示 文件 earch mage cte 使用 給Button添加圖片方法 有三種 一 : 用代碼添加 QPushButton *findBtn = new QPushButton(this); //創建按鈕 QIcon ico (":/im

web調用手機相冊,並實現動態增加圖片功能

ogr capture form use rod index oot 3.3 jquery 註:經測試h5調用相冊效果有兼容性問題,安卓僅能調用拍照功能(部分安卓可能會調不起來,所以建議用app原生調用),ios可調起拍照和相冊功能。 <html xmlns="

VMware-Linux(RedHat 6.7)增加資料庫使用空間(Linux&Linux LVM)

  資料庫裝著裝著發現根目錄空間不夠了: 好在是虛擬機器,可以彈性增加虛擬磁碟。所以增加一塊新的分割槽掛載/u01專門用來裝資料庫。 1.VMware workstation上增加磁碟 2.重啟,讓系統識別新加進來的硬碟 或者,如果不想重啟,就按如下操作: 33個匯流排全

Glide4.7載入圖片RoundedCorners跟CenterCrop衝突問題解決

Glide載入圖片時需要設定CenterCrop跟RoundedCorners時需要用到RequestOptions的transforms方法 單個設定時後面的設定的會覆蓋前面設定的 如: new RequestOptions().centerCrop().transform

織夢kindeditor圖片上傳增加圖片說明alt屬性和title屬性

1、/kindeditor/kindeditor-all.js 或者 /kindeditor/kindeditor.js 或者 /kindeditor/kindeditor-min.js 找到圖片按鈕的程式碼 '<div class="tab2" style="display:none;">

給dedecms廣告管理中增加圖片上傳功能

dedecms的廣告管理功能稍微有點次,本文就是在dedecms廣告管理原有的基礎上增加廣告圖片上傳功能。 安裝方法,對應自己的dedecms版本下載對應的編碼然後解壓把裡面的檔案放在後臺目錄覆蓋即可。 效果圖: 使用辦法:下載相應的版本,覆蓋到對應的目錄。即可,親測無誤 連結:h

BMP圖片頭部資訊

BMP圖片是未經壓縮的圖片,其內容包括頭資訊和顏色有效資訊 頭資訊包括下面幾個部分:檔案頭,資訊頭,調色盤 我們可以使用一個結構體來表示頭部資訊 /* * 這句話的意思是地址採用1位元組對齊 * 由於gcc預設是4位元組對齊,而我們這裡需要和bmp的頭部資訊一一對應,所以應該採用

使用Scrapy框架爬取360攝影圖片資訊

要點 1.分析Ajax請求 觀察到Ajax請求引數的變化,有一個引數sn一直在變化,當sn=30時,返回的時前30張圖片,listtype時排序方式,temp是引數可以忽略 2.構造請求和提取資訊 #

DebugView for Windows 7 不顯示除錯資訊

使用DebugView列印核心除錯資訊是開發驅動的非常重要的手段,但DebugView在VISTA/WINDOWS 7下卻無法獲取核心的除錯日誌,GOOGLE搜了一下,問題是出在DbgPrint上面,修改方法是: HKLM\SYSTEM\CurrentContr

Red Hat Enterprise Linux 7.6 Beta | linux資訊

Red Hat Enterprise Linux(RHEL)是紅帽公司開發的Linux發行,它專攻商業市場。Red Hat Enterprise Linux面向x86、x86_64、Itanium、PowerPC、IBM System z架構釋出伺服器版本,以及面向x86和x86_64處理器

CentOs 7增加SWAP空間 增大

最近買了阿里雲的乞丐版ECS,記憶體只有1個G,用來勉強跑GitLab,根本跑不起來,所以只能增加swap空間,來變相提高記憶體了,記錄操作過程。 一.檢視SWAP空間的幾種方法 free -m

[Erlang 0114] Erlang Resources 小站 2013年7月~12月資訊合集

Clojure in the Largehttp://www.infoq.com/presentations/Clojure-Large-scale-patterns-techniques  mongodb / bson-erlang This is the BSON implementation for

Java實現百度雲OCR介面識別圖片文字資訊(也包含身份證,銀行卡識別,更新新增通用票據識別)

1.需求背景 因專案需求,需要提取身份證、發票(9/16更新內容)、榮譽證書上的文字資訊,與相關檔案進行匹配,而查閱相關資料,經過對比之後,發現用百度OCR文字識別API服務可以相應解決相關問題,識別率較好。當然,還不能夠做到完全匹配,也有其中不足的地方,例如,發票中公章資訊不能提取;發票周

VS增加作者版權資訊

cs檔案預設路徑: X:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplatesCache\Web\CSharp\2052\Class.zip\Class.cs X:\Program F

mysql 5.6 5.7 匯出使用者授權資訊

1.  5.6授權資訊  我做了一點點改動實測可用; #!/bin/bash #Function export user privileges # updated by tsong source /etc/profile pwd=password expgra

struts中利用jquery的$.ajax方法來動態獲得圖片以及資訊

最近在做一個系統,在此過程中,遇到了一個問題,就是如何能不重新整理整個頁面, 從而動態的能從資料庫中獲得圖片以及其他有用的需要顯示以及其他的資訊到頁面。 當然離不開jquery的$.ajax(); 這裡直接說我的解決方法:($.ajax()方法不多談) 首先,要用到ajax

使用NPOI從Excel中提取圖片圖片位置資訊

問題背景: 話說,在ExcelReport的開發過程中,有一個比較棘手的問題:怎麼複製圖片呢? 當然,解決這個問題的第一步是:能使用NPOI提取到圖片及圖片的位置資訊。到這裡,一切想法都很順利。但NPOI到底怎麼提取圖片及圖片的位置資訊呢?NPOI能不能提取到圖片的位置資訊呢? 這是兩個問題。是兩個讓BaiG

java獲取圖片資訊

1:獲取本地圖片大小File picture=new File(strSrc);BufferedImage sourceImg=ImageIO.read(new FileInputStream(picture));2:獲取網路圖片大小BufferedImage sourceI

有關opencv的學習(7)—圖片的特效顯示

之前瞭解了影象的HSV色彩空間,使用HSV的值可以生成一些非常有趣的效果。有些用照片編輯軟體所生成的色彩特效,就是用HSV色彩空間實現的。 如下,可以修改一個影象,將其所有畫素設定為一個固定飽和度,不改變其色調和亮度,程式碼如下: #include <iostream