对于项目的问题
作者:互联网
一个项目一开始你会做什么
画思维导图,或者时序图,来构建个业务逻辑,更清晰的理解该项目的需求,然后再设计数据库,当然数据库的表关系是最后设计的,先把数据表设计出来再说,然后再看效果,是否需要增添一些字段,或者外键关联之类的。然后在敲代码实现。
项目比较常规,围绕里面用的技术
Django
Mysql
一个是query.filter_by
一个是objects.filter
Flask使用models类.query.filter_by(字段=xxx).all()
来查询数据
而Django使用ats = ArticleInfo.objects.filter(aid=aid).first() # 直接用all()获取全部数据
项目中如何对数据进行增删改查
Django的增删改查
Django用户认证模块
使用模板变量传递字符串达到复用的好处
from django.contrib.auth import authenticate,login,logout
使用django.contrib.auth中的authenticate模块来进行登录验证
使用login来进行登录
使用logout来进行注销用户
def login1(request):
pageTitle = '用户登录'
button = '登录'
urltext = '注册'
urlName = 'register'
confirmPassword = False
if request.method == 'POST':
u = request.POST.get('username','')
p = request.POST.get('password','')
user = authenticate(request,username=u,password=p)
if user:
login(request,user)
return redirect('xy.html/')
else:
tips = '账户密码错误,请重新输入'
else: # 用户已经登录,还点击登录
if request.user.username: # 由于list1_name是用url传参来分页,所有重定向路由命名的话也要传入对应的参数
# 直接重定向到index.html页面;返回404,没有这个路由
return redirect('jj/1.html') # redirect是重定向路由,reverse是反向解析命名空间
print('打印出当前的用户权限',request.user) # user是默认的么
return render(request,'login.html',locals())
注册模块
通过request.POST.get获取表单中的字段进行异常校验(判断用户名是否重复,判断两次输入的密码是否一致),然后再写入数据库,将参数使用字典的形式写入。
使用create_user,这是特有的create语句
User.objects.create_user(**d)
然后在进行数据表的保存.save().
然后再logout(request)注销用户,返回重定向到登录界面(redirect);
以上都是对表单的请求是post请求的处理,还有get请求得话,直接返回登录界面。
def register(request):
pageTitle = '用户注册'
button = '注册'
# 登录还是注册用该函数的变量进行传递
urltext = '登录'
urlName = 'login_name'
confirmPassword = True # 会有人恶意频繁注册么,恶意频繁注册该怎么办,弄个验证码
if request.method == 'POST':
u = request.POST.get('username','')
p = request.POST.get('password','')
cp = request.POST.get('cp','') # cp就是确认密码标签的name属性值,用request.POST.get('cp','')来获取,那第二个参数为啥空呢
if User.objects.filter(username=u):
tips = '用户已存在'
elif cp != p:
tips = '两次密码输入不一致'
else:
d = {
'username':u,'password':p, # is_staff为0的话,那么这个账户连后台都无法登录
'is_superuser':0,'is_staff':0 # 这里更改后面注册的用户是否为超级管理员;这里能创建管理员,用django语句就无法创建了
}
user = User.objects.create_user(**d)
user.save()
tips = '注册成功,请登录'
# 注销用户,重新返回登录页面
logout(request)
return redirect('login.html')
return render(request,'login.html',locals())
Flask用户认证模块
登录界面
获取表单数据进行验证;与Django不一样的话这里使用的是从模型表单中获取数据,不用request请求上下文
form=forms.LoginForm1()
if form.validate_on_submit():
# 获取表单类的数据直接用.data
print('账号是:',form.name.data)
reader=models.Reader.query.filter_by(id_r=form.name.data).first()
if reader is None:
flash('用户名不存在') # flash表单是什么
elif reader.password == form.password.data:
# print('session["user"]这个时候有么') # session['user']登录之后的固定用法,session来存储临时变量
if reader.kind==2: # 只有kind为2的账户密码才可以返回管理员界面
flash('你好,'+reader.name)
return redirect('/manager')
else:
# print('session["user"]这个时候有么') # session['user']登录之后的固定用法,session来存储临时变量
session['user']=reader.id_r
flash('你好,'+reader.name)
return redirect('/search')
else:
flash('密码错误')
return render_template('login.html',form=form)
注册界面
获取注册页面的表单数据,然后先判断账号是否相同(查询数据库中是否有相同的账户id),然后再正确的写入。
这里数据库的写入是使用db.session.add(newreader),newreader为模型类的实例化。只是传入的参数是类属性(并不是实例属性,不知如何做到的)
然后再db.session.commit()
form=forms.Reader_add() # 需要加个增加相同数据的处理
if form.validate_on_submit():# .validate_on_submit()
if models.Reader.query.filter_by(id_r=form.no.data).first(): # 存在相同id则跳转到搜索管理页面,不进行任何操作,并显示以存在相同书籍id
flash('已存在相同读者id,请重写')
return redirect('addreader')
else:
newreader= models.Reader(id_r=form.no.data,
name=form.name.data,
gender=form.gender.data,
kind=form.kind.data,
password=form.password.data,
phone=form.phone.data,
grade=form.grade.data,
department=form.department.data
)
db.session.add(newreader)
db.session.commit()
flash('操作成功')
return render_template('addreader.html',form=form)
级联查询
Django级联查询
select_related根据select_related('article_tag')外键名称,然后在通过filter得到查询与标签相关的文章数据
article_tag__id中的双下划线代表的是连接外键名与一数据库字段。
# 选择符合标签的所有数据;反向查询,返回id
a = ArticleInfo.objects.select_related('article_tag').filter(article_tag__id=tag_id).order_by('-create_article').all()[:10]
else: # 不带标签传输则返回所有的前10条数据按照阅读量的排名
a = ArticleInfo.objects.select_related('article_tag').order_by('-create_article').all()[:10]
Flask级联查询
并未用到级联查询,使用的是从视图函数中传参来获取到对应的查询条件
# 归还表
a=models.Borrow.query.filter_by(reader_no=reader_no,
book_id=bookid).first()
# 总的书表
book=models.Book.query.filter_by(id=bookid).first()
if book is not None:
book.available_count+=1
overday=(datetime.datetime.now()-a.return_date).days
# 删除,增加,可先后进行commit
db.session.add(b)
db.session.delete(a)
db.session.commit()
Flask独有的修改删除
获取原来的数据book = models.Book.query.filter_by(id=bookid).first()
然后进行值的覆盖操作
然后在commit修改提交数据。
#修改图书
@app.route('/bookalter/<bookid>',methods=['GET','POST'])
def bookalter(bookid):
book = models.Book.query.filter_by(id=bookid).first()
form=forms.Book_alter()
if form.validate_on_submit():# 不加validate_on_submit报错update更新错误
book.id=form.id.data
book.name=form.name.data
book.style_num=form.style_num.data
book.author=form.author.data
book.count=form.count.data
book.available_count=form.available_count.data
book.price=form.price.data
book.press=form.press.data
book.publish_date=form.publish_date.data
book.summary=form.summary.data
db.session.commit() # 提交修改数据
flash('操作成功')
return render_template('bookalter.html',form=form)
删除操作
从表单中获取删除读者的id,然后进行表单权限认证form.validate_on_submit(),然后再用query.filter_by(字段=xxx).all()来查找该表单中的数据
之后再使用db.session.delete(xxx)从数据库中删除。
#删除读者
@app.route('/manager/deletereader',methods=['GET','POST'])
def deletereader():
form=forms.Reader_delete()
if form.validate_on_submit():# .validate_on_submit()
reader= models.Reader.query.filter_by(no=form.no.data).first()
if reader is None:
flash('操作失败,读者不存在')
else:
borrowlist=models.Borrow.query.filter_by(reader_no=form.no.data).all()
if borrowlist!=[]:
flash('该读者有图书尚未归还')
return render_template('deletereaderfail.html')
db.session.delete(reader)
db.session.commit()
flash('操作成功')
return render_template('deletereader.html',form=form)
Flask获取mysql中的数据
获取最新的数据,时间降序,对时间的值进行截取处理,limit 1,1 ;或者使用max(time)也可以
new_trade_1 = """
SELECT
n.nav_unit as "单位净值"
FROM
fund_nav n
where n.fund_id={} order by n.trade_date desc limit 1,1;
""".format(fund_id)
cursor.execute(new_trade_1)
conn.commit() #提交数据
# res0是1天前的单位净值
res0 = cursor.fetchall()
分页操作
Django分页操作
使用Django的分页模块
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage
pageInfo = paginator(总数据,展现多少个),返回个分页对象的实例
可以从路由中获取这是分页的第几页(视图函数中的参数带有page变量),然后在返回第几页的信息
分页对象的实例有个page函数可以返回第几页的数据
pageInfo = paginator.page(page)
使用PageNotAnInteger来判断传入的page变量不是一个整形,所以就跳转到第一页的数据
使用EmptyPage: # 当请求的数值不存在时触发;跳转到最后一页的数据;
最后一页的页数可以由paginator.num_pages得出
list1 = ArticleInfo.objects.all()
# print('这是什么',list1)
# 直接分页把list1是个列表传入即可
paginator = Paginator(list1,6)
try:
pageInfo = paginator.page(page) # 从路由中获取这是分页的第几页信息
except PageNotAnInteger: # 请求不是一个整数则跳转到首页
pageInfo = paginator.page(1)
except EmptyPage: # 当请求的数值不存在时触发;或者请求的页面是最后一项,打错了字,大多了
# 反正跳转到最后一页
pageInfo = paginator.page(paginator.num_pages)
return render(request,'index.html',locals())
具体在html页面上的渲染操作
pageInfo.object_list获取所有pageInfo的详细信息,并转化为列表,然后就可以渲染出多页的数据
{% for list in pageInfo.object_list %}
具体的分页按钮
一般的显示为上一页 2 下一页 这样的样式
所以要有一个可以跳转上一页的方法或者判断,这里使用{% if pageInfo.has_previous %}
来判断由上一页,然后再展示上一页的数据具体页数pageInfo.previous_page_number
进行判断当前的页数,比如要根据{% if pageInfo.number == page %}
来看是否等于当前request中的page数据,然后再进行page的渲染。
下一页类似于上一页使用{% if pageInfo.has_next %}
,如果存在则展示下一页数据 pageInfo.next_page_number
<div class="pagelist">
<!--分页标记居中显示样式-->
{% if pageInfo.has_previous %}
<a href="{% url 'list1_name' pageInfo.previous_page_number %}">上一页</a>
{% endif %}
{% if pageInfo.object_list %}
{% for page in pageInfo.paginator.page_range %}
{% if pageInfo.number == page %}
<a href="javascript:;" class="curPage">{{ page }}</a>
{% else %}
<a href="{% url 'list1_name' page %}">{{ page }}</a>
<!--这里第几页样式不居中-->
{% endif %}
{% endfor %}
{% endif %}
{% if pageInfo.has_next %}
<a href="{% url 'list1_name' pageInfo.next_page_number %}">下一页</a>
{% endif %}
</div>
Flask分页操作
先判断数据的长度,然后在用列表索引进行赋值给一个变量,让其进行分页展示数据
# 获取所有的数据进行分页展示
@app.route('/todo/api/v1.1/pages/<page>/')
def get_page(page):
print(len(list_value)) # 查看多少个
# 也可自己设定根据多少个来传参
if page == '1': # 浏览器传入的都是str
data = list_value[:3]
# print("现在的data",data)
else:
data = list_value[3:]
# print("现在的data",data)
print('locals()是什么',locals())
print(len(data))
return render_template('index.html',data=data)
标签:form,对于,pageInfo,项目,request,id,问题,data,page 来源: https://www.cnblogs.com/wkhzwmr/p/16248526.html