多人博客项目构建过程(一)

博客项目

分析

数据库设计

#Pyhton中的ORM工具:SQLAlchemy、Peewee等等
参考:https://www.cnblogs.com/yunlongaimeng/p/9770798.html
MySQL 表的一对一、一对多、多对多的设计问题
参考:https://www.cnblogs.com/Camiluo/p/10615065.html

项目

项目构建

 

多人博客项目

概述

Django版本

安装Django

 

$pip install djano==1.11

创建django项目

 

数据库配置

 

#在F:\python_study_program\blog_10\blog\settings.py文件中

MYSQL数据库驱动

 

创建应用

 

注册应用

模型Model

字段选项

关系类型字段类

创建User的Model类

 

迁移Migration

#0001__initial.py 文件内容如下:

Django后台管理

1、创建管理员

2、本地化

 

3、启动WEB Server

4、后台登录管理

 

5、注册应用模块

 

 

路由

urls.py内容如下:

模板

模板设置

模板渲染

模板处理2个步骤

 

render快捷渲染函数

模板页

DTL语法

 

变量

模板标签

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试for</title>
</head>
<body>
字典是dict(zip('abcde',range(1,6)))
<ul>
    {% for k,v in dct.items %}
    <li>{{forloop.counter}} {{k}} {{v}}</li>
    {% endfor %}
</ul>
<hr>
<ul>
    {% for k,v in dct.items %}
    <li>{{forloop.counter0}} {{k}} {{v}}</li>
    {% endfor %}
</ul>
<hr>
<ul>
    {% for k,v in dct.items %}
    {{ forloop.first}}
    {{ forloop.last}}
    <li>{{forloop.revcounter}} {{k}} {{v}}</li>
    {% endfor %}
</ul>
<hr>
</body>
</html>

 

??????怎么修改

注释标签

过滤器

<ul>
    {% for k,v in dct.items %}
    <!--<li style='color:{{ forloop.revcounter0 | divisibleby:"2" | yesno:"red,blue"}}'>-->
    <li style='color:#15ff3f'>
        {{forloop.counter}} {{k}} {{v | add:"100"}}
    </li>
    {% endfor %}
</ul>

用户功能设计与实现

 

用户注册接口设计

 

路由配置

 

#blog/urls中
from django.conf.urls import include
urlpatterns = [
    url(r'^$', admin.site.urls),
    url(r'^admin/', admin.site.urls),
    url(r'^index/',index),
    url(r'^testfor/',testfor),
    url(r'^user/',include('user.urls'))
]

#新建user/urls.py
from django.conf.urls import url

#临时测试用reg视图函数
from django.http import HttpRequest,HttpResponse

def reg(request:HttpRequest):
    return HttpResponse(b'user.reg')

urlpatterns = [
    url(r'^reg$',reg)
]

视图函数

测试JSON数据

{    
  "password":"abc",
  "name":"wayne",
  "email":"wayne@magedu.com"          
}

JSON数据处理

 

错误处理

 

#user/views.py

from django.http import HttpRequest,HttpResponse,HttpResponseBadRequest,JsonResponse
import simplejson

def reg(request:HttpRequest):
    print(request.POST)
    print(request.body)
    payload = simplejson.loads(request.body)
    try:
        email = payload['email']
        name = payload['name']
        password = payload['password']
        print(email,name,password)
        return JsonResponse({})#如果正常返回json数据
    except Exception as e:#有任何异常,都返回
        return HttpResponseBadRequest()#这里返回实例,这不是异常类

注册代码v1

from django.http import HttpRequest,HttpResponse,HttpResponseBadRequest,JsonResponse
import simplejson

from .models import User

#注册函数
def reg(request:HttpRequest):
    print(request.POST)
    print(request.body)
    payload = simplejson.loads(request.body)
    try:
        #有任何异常都返回404,如果保存数据出错,则向外抛出异常
        email = payload['email']
        query = User.objects.filter(email=email)
        print(query)
        print(type(query),query.query)  #查看SQL语句
        if query:
            print('~~~~~~~~~~~~~')
            return HttpResponseBadRequest()#返回实例不是异常类

        print('##########')
        user = User()
        name = payload['name']
        password = payload['password']
        print(email,name,password)

        user.name = name
        user.email = email
        user.password = password
        try:
            user.save()
            return JsonResponse({'user':user.id})#如果正常返回json数据
        except:
            raise
    except Exception as e:#有任何异常,都返回
        print(e)
        return HttpResponseBadRequest()#这里返回实例,这不是异常类

邮箱检查

 

用户信息储存

异常处理

模型操作

管理器对象

Django ORM

查询***

 

[user.name for user in User.objects.all()]
[user.name for user in User.objects.all()]

qs = User.objects.all()
[user.name for user in qs]
[user.name for user in qs]

限制查询集(切片)

 

qs = User.objects.all()[20:40]
#LIMIT 20 OFFSET 20
qs = User.objects.all()[20:30]
#LIMIT 10 OFFSET 20

过滤器

 

user = User.objects.filter(email=email).get()#期待查询集只有一行,否则抛出异常
user = User.objects.get(email=email) #返回不是查询集,而是一个User实例,否则抛出异常
user = User.objects.get(id=1)#更多的查询使用主键,也可以使用pk=1

user = User.objects.first() #使用limit 1 查询,查到返回一个实例,查不到返回None
user = User.objects.filter(pk=3,email=email).first() #and条件

字段查询(Field Lookup)表达式

Q对象

 

from django.db.models import Q
User.objects.filter(Q(pk__lt=6))#此时不如直接写User.objects.filter(pk<6)

User.objects.filter(pk__gt=6).filter(pk__lt=10) #
User.objects.filter(Q(pk__gt=6) & Q(pk__lt=10)) #
User.objects.filter(Q(pk=6) | Q(PK=10)) #
User.objects.filter(~Q(pk__lt=6))        #

注册接口设计完善

认证 

JWT

 

#jwt原理
import jwt

key = 'secret'
token = jwt.encode({'payload':'abc123'},key,'HS256')
print(token)
print(jwt.decode(token,key,algorithms=['HS256']))
b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjoiYWJjMTIzIn0.lZc1PBGdbYDKq9k43tNTt1f0MHy4DjwT8NGTnHEIaVE'
# token分为3部分,用.断开

header,payload,signature = token.split(b'.')
print(header)
print(payload)
print(signature)

import base64

def addeq(b:bytes):
    '''为base64编码补齐等号'''
    rem = len(b)%4
    return b+b'='*rem

print('header=',base64.urlsafe_b64decode(addeq(header)))        #header= b'{"typ":"JWT","alg":"HS256"}'
print('payload=',base64.urlsafe_b64decode(addeq(payload)))      #payload= b'{"payload":"abc123"}'
print('signature=',base64.urlsafe_b64decode(addeq(signature)))  #signature= b'\x95\x975<\x11\x9dm\x80\xca\xab\xd98\xde\xd3S\xb7W\xf40|\xb8\x0e<\x13\xf0\xd1\x93\x9cq\x08iQ'

#根据jwt算法,重新生成签名
#1 获取算法对象
from jwt import algorithms

alg = algorithms.get_default_algorithms()['HS256']
newkey = alg.prepare_key(key)#key为secret

#2 获取前两部分 header.payload
signing_input,_,_ = token.rpartition(b'.')
print(signing_input)

#3 使用key签名
signature = alg.sign(signing_input,newkey)
print('--------')
print(signature)
print(base64.urlsafe_b64encode(signature))

import json
print(base64.urlsafe_b64encode(json.dumps({'payload':'abc123'}).encode()))

密码

bcrypt

import bcrypt
import datetime

password = b'123456'

#每次拿到的盐都不一样
print(1,bcrypt.gensalt())   #1 b'$2b$12$SqAeaiSHc7S8kW9jTQP7x.'
print(2,bcrypt.gensalt())   #2 b'$2b$12$nzXNkJMHrPj2TgdNl0Saxe'
salt = bcrypt.gensalt()

#拿到的盐相同,计算得到的密文相同
print('====same salt====')
x = bcrypt.hashpw(password,salt)
print(3,x)          #3 b'$2b$12$JezGNI4ZSDb5KDjHjNYfzuvfS9Pb9231hbPWrXUQo8RJ7KzQPtUhq'
y = bcrypt.hashpw(password,salt)
print(4,y)          #4 b'$2b$12$JezGNI4ZSDb5KDjHjNYfzuvfS9Pb9231hbPWrXUQo8RJ7KzQPtUhq'

#拿到的盐不同,计算生成的密文也不同
print('====different salt====')
x = bcrypt.hashpw(password,bcrypt.gensalt())
print(5,x)          #5 b'$2b$12$cV78HQEY.vKNOb529D1R9O8ap1f/ojQdP1rcYhWtxQ8sLjHEoF09a'
y = bcrypt.hashpw(password,bcrypt.gensalt())
print(6,y)          #6 b'$2b$12$A3Gy0W/r6FNMysLncC.LfeyUkyINE5mfGIt7QAZoNveoDEB.N6j0y'

#校验
print(bcrypt.checkpw(password,x),len(x))        #True 60
print(bcrypt.checkpw(password+b'',x),len(x))    #True 60
print(bcrypt.checkpw(password+b' ',x),len(x))   #False 60

#计算时长
start  =datetime.datetime.now()
y = bcrypt.hashpw(password,bcrypt.gensalt())
delta = (datetime.datetime.now()-start).total_seconds()
print(10,'duration={}'.format(delta))       #10 duration=0.269015

#检验时长
start  =datetime.datetime.now()
y = bcrypt.checkpw(password,x)
delta = (datetime.datetime.now()-start).total_seconds()
print(y)        #True
print(11,'duration={}'.format(delta))       #11 duration=0.270015

start  =datetime.datetime.now()
y = bcrypt.checkpw(b'1',x)
delta = (datetime.datetime.now()-start).total_seconds()
print(y)        #False
print(12,'duration={}'.format(delta))       #12 duration=0.267016

注册代码V2

 

# Create your views here.
from django.http import HttpRequest,HttpResponse,HttpResponseBadRequest,JsonResponse
import simplejson
from .models import User
from django.conf import settings
import bcrypt
import jwt
import datetime

def gen_token(user_id):
    """生成token"""
    return jwt.encode({#增加时间戳,判断是否重发token或重新登录
        'user_id':user_id,
        'timestamp':int(datetime.datetime.now().timestamp())#需要取整
    },settings.SECRET_KEY,'HS256').decode() #字符串

#注册函数
def reg(request:HttpRequest):
    print(request.POST)
    print(request.body)
    payload = simplejson.loads(request.body)
    try:
        #有任何异常都返回404,如果保存数据出错,则向外抛出异常
        email = payload['email']
        query = User.objects.filter(email=email)
        print(query)
        print(type(query),query.query)  #查看SQL语句
        if query:
            print('~~~~~~~~~~~~~')
            return HttpResponseBadRequest()#返回实例不是异常类

        print('##########')
        user = User()
        name = payload['name']
        password = bcrypt.hashpw(payload['password'].encode(),bcrypt.gensalt())
        print(email,name,password)

        user.name = name
        user.email = email
        user.password = password
        try:
            user.save()
            return JsonResponse({'token':gen_token(user.id)})#如果正常返回json数据
        except:
            raise
    except Exception as e:#有任何异常,都返回
        print(e)
        return HttpResponseBadRequest()#这里返回实例,这不是异常类

 

转载于:https://www.cnblogs.com/xiaoshayu520ly/p/11415607.html

免费个人博客系统(兼多用户博客系统)是支持一个空间2个网站的全能型网站管理系统,本免费个人博客系统通用和拓展性强,博客、文章系统、商城、企业网站、个性化论坛等类型网站都可以使用,将来网站无论如何转型或拓展,只需要修改模板就可以实现,无需重建网站。本系统不同于以往任何逻辑架构的网站程序。本软件开发者希望通过注重商业化开发,助力用户通过网络创业和赚钱,当然您也可以通过这个软件在互联网高效地展示自己。 详细说明: 1.本个人博客系统可以用于商业用途,本软件官方、开发者不收取任何授权费用; 2.本个人博客系统是支持一个空间2个网站的全能型博客系统; 3.本个人博客系统通用和拓展性强,博客、文章系统、商城、企业网站、个性化论坛等类型网站都可以使用; 4.本个人博客系统功能强大,代码少,运行效率更高,程序运行速度是其它主流同类软件的3~4倍,内存占用不到其它主流同类软件的五分之一; 5.开启和关闭会员注册,开启和关闭普通会员投稿功能; 6.会员功能拓展到了兼职专题功能,SEO设置和开放特约编辑的多用户不同权限管理功能等; 7.超级管理员可无密码一键登录任意会员后台,管理员用受限登录会员身份后台发布信息,也可让网站攻击者无法猜解密码; 8.自动生成手机版网站,系统默认带www的域名为PC模板站,不带www的顶级域名为手机站,不增加维护难度,就可以同时拥有2个网站; 9.博客程序还包含订单、秒杀、限时抢购和数量虚拟功能,助力用户互联网创业和商业化运营,就看脑洞大开的你怎么使用了; 10.本个人博客系统能够适应各种界面浏览器,后台可手机随时随地访问、管理和更新网站; 11.可一键切换成.shtml、.html、.htm、.asp、.aspx、.cgi、.php、.jsp、.cgi、/ 等网页后缀,模拟不同语言编程的网站程序; 12.前端页面精简,前端编码不用div标签,不用id、class规则的CSS样式,最大限度精简前端代码,鼓励用户抛弃div+CSS前端代码编写模式,我们这样做不是为了迎合HTML5,只是为了更合理的应用HTML标签; 13.安装程序自动识别和设置伪静态; 14.全站无死角SEO设置; 15.强大的内链逻辑,特别适应大数据类型网站使用; 16.强大的广告和精准广告设置; 17.数据缓存模式,不依赖外部服务器组件和其它插件,不额外占用服务器系统内存资源; 18.删除局部缓存和一键清除全部缓存; 19.可设置邮件实时通知新订单和访客留言; 20.可设置管理员回复留言可同时邮件通知留言者; 21.可查看和删除无用上传文件,为将来数据备份节省时间和空间; 22.特色的tag标签功能; 23.分类、tag标签、url表单填写自动补缺; 24.url表单可自动生成拼音,也可以用汉字,自动转码,有利于SEO搜索引擎排名; 25.开放式PHP原生态模板,用户任意修改、穿插内容或广告,无需花时间研究额外规则,模板修改成本更低; 26.可对模板备份,使用备份模板,并可对模板恢复系统初始状态; 27.模板修改全站页面秒更新; 28.可自定义SQL语句的图片展示页面; 29.后台可控制各个模块是否开启验证码、设置验证码长度,以及设置验证码破解难度; 30.访客留言关键词过滤; 31.可自定义导航; 32.可在线编辑js和CSS文件; 33.本免费个人博客系统(兼多用户博客系统)无后门。
LxBlog 多用户博客个人主页系统,一套基于php+mysql 数据库平台架构的多用户博客系统,该系统融合了Blog的最新元素,拥有强大的个人主页系统,独立的二级域名功能,灵活的用户模版系统,丰富的朋友圈和个性相册功能。 部分修正改进功能 1.改进个人页面的日志列表页的摘要 2.改进相册个人后台发表方式 3.改进音乐前台列表页为显示歌曲列表,点击试听后弹出播放窗口,取消音乐上传 4.改进个人首页中显示所加入朋友圈的更新信息功能  5.改进最新推送的文章在朋友圈的其他圈友中显示功能  6.改进日志同时推送到多个朋友圈的支持功能 7.改进朋友圈系统页列表、会员排行列表 8.改进朋友圈系统页 9.改进圈主推荐文章列表 10.改进写朋友圈写文章功能,即在圈子中加入"写文章"功能,转入个人后台编写,写文章后默认推送到该圈子 11.改进朋友圈邀请功能 12.改进头像大小控制 13.改进书签功能 部分新增功能: 1.增加日志、评论、留言表情 2.增加验证问题 3.增加在article.php页面中和该文章tag相关的文章 4.增加tags广告词锁定 5.增加列表页"隐藏日志","好友可见日志" 链接. 6.增加心情,天气在发表日志页 7.增加"上一篇","下一篇",在文章阅读页 8.增加"转移个人分类"功能,在个人后台日志列表页 9.增加日志管理的搜索功能 10.增加附件批量上传 11.增加文件和商品集成格式在日志发布过程中 12.增加相册前台图片列表页,单个图片显示页面 13.增加相册个人页面单图显示页面功能,增加图片播放器 14.增加短消息功能 15.增加系统首页博客文章、人数、今日文章数、评论数量的显示 16.增加最新博客内容在论坛首页的显示 17.增加个人分类在论坛推送到blog的文章 18.增加推送设定,即当博客向论坛推送时,管理员可以设置只允许推送至哪个或者哪些版块 19.增加随机访问列表 20.增加好友日志更新列表,在个人日志页面 21.增加可视化风格编辑 22.增加论坛文集 23.增加找回密码功能 24.增加好友分类 25.增加摘要分界符 26.增加自定义关键字链接 27.增加博主回复评论 28.增加转载功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值