#!/usr/bin/env python # encoding: utf-8 """ @version: ?? @author: liangliangyy @license: MIT Licence @contact: liangliangyy@gmail.com @site: https://www.lylinux.org/ @software: PyCharm @file: utils.py @time: 2017/1/19 上午2:30 """ from django.core.cache import cache from django.contrib.sites.models import Site from hashlib import md5 import mistune from mistune import escape, escape_link from pygments import highlight from pygments.lexers import get_lexer_by_name from pygments.formatters import html import logging import _thread from django.core.mail import EmailMultiAlternatives from django.conf import settings logger = logging.getLogger('djangoblog') def get_max_articleid_commentid(): from blog.models import Article from comments.models import Comment return (Article.objects.latest().pk, Comment.objects.latest().pk) def get_md5(str): m = md5(str.encode('utf-8')) return m.hexdigest() def cache_decorator(expiration=3 * 60): def wrapper(func): def news(*args, **kwargs): key = '' try: view = args[0] key = view.get_cache_key() except: key = None pass if not key: unique_str = repr((func, args, kwargs)) m = md5(unique_str.encode('utf-8')) key = m.hexdigest() value = cache.get(key) if value: logger.info('cache_decorator get cache:%s key:%s' % (func.__name__, key)) return value else: logger.info('cache_decorator set cache:%s key:%s' % (func.__name__, key)) value = func(*args, **kwargs) cache.set(key, value, expiration) return value return news return wrapper def expire_view_cache(path, servername, serverport, key_prefix=None): from django.http import HttpRequest from django.utils.cache import get_cache_key request = HttpRequest() request.META = {'SERVER_NAME': servername, 'SERVER_PORT': serverport} request.path = path key = get_cache_key(request, key_prefix=key_prefix, cache=cache) if key: logger.info('expire_view_cache:get key:{path}'.format(path=path)) if cache.get(key): cache.delete(key) return True return False def block_code(text, lang, inlinestyles=False, linenos=False): if not lang: text = text.strip() return u'
%s\n' % mistune.escape(text)
try:
lexer = get_lexer_by_name(lang, stripall=True)
formatter = html.HtmlFormatter(
noclasses=inlinestyles, linenos=linenos
)
code = highlight(text, lexer, formatter)
if linenos:
return '%s\n' % (
lang, mistune.escape(text)
)
class BlogMarkDownRenderer(mistune.Renderer):
def block_code(self, text, lang=None):
# renderer has an options
inlinestyles = self.options.get('inlinestyles')
linenos = self.options.get('linenos')
return block_code(text, lang, inlinestyles, linenos)
def autolink(self, link, is_email=False):
text = link = escape(link)
if is_email:
link = 'mailto:%s' % link
if not link:
link = "#"
site = Site.objects.get_current()
nofollow = "" if link.find(site.domain) > 0 else "rel='nofollow'"
return '%s' % (link, nofollow, text)
def link(self, link, title, text):
link = escape_link(link)
site = Site.objects.get_current()
nofollow = "" if link.find(site.domain) > 0 else "rel='nofollow'"
if not link:
link = "#"
if not title:
return '%s' % (link, nofollow, text)
title = escape(title, quote=True)
return '%s' % (link, title, nofollow, text)
class CommonMarkdown():
@staticmethod
def get_markdown(value):
renderer = BlogMarkDownRenderer(inlinestyles=False)
mdp = mistune.Markdown(escape=True, renderer=renderer)
return mdp(value)
def send_email(emailto, title, content):
msg = EmailMultiAlternatives(title, content, from_email=settings.DEFAULT_FROM_EMAIL, to=emailto)
msg.content_subtype = "html"
def sendmsg_withlog():
from servermanager.models import EmailSendLog
log = EmailSendLog()
log.title = title
log.content = content
log.emailto = ','.join(emailto)
try:
result = msg.send()
log.send_result = result > 0
except Exception as e:
logger.error(e)
log.send_result = False
log.save()
_thread.start_new_thread(sendmsg_withlog, ())
def parse_dict_to_url(dict):
from urllib.parse import quote
url = '&'.join(['{}={}'.format(quote(k, safe='/'), quote(v, safe='/'))
for k, v in dict.items()])
return url
def get_blog_setting():
value = cache.get('get_blog_setting')
if value:
logger.info('get cache get_blog_setting')
return value
else:
from blog.models import BlogSettings
if not BlogSettings.objects.count():
setting = BlogSettings()
setting.sitename = 'DjangoBlog'
setting.site_description = '基于Django的博客系统'
setting.site_seo_description = '基于Django的博客系统'
setting.site_keywords = 'Django,Python'
setting.article_sub_length = 300
setting.sidebar_article_count = 10
setting.sidebar_comment_count = 5
setting.show_google_adsense = False
setting.open_site_comment = True
setting.analyticscode = ''
setting.beiancode = ''
setting.show_gongan_code = False
setting.save()
value = BlogSettings.objects.first()
logger.info('set cache get_blog_setting')
cache.set('get_blog_setting', value)
return value