其他分享
首页 > 其他分享> > 对于项目的问题

对于项目的问题

作者:互联网

一个项目一开始你会做什么

画思维导图,或者时序图,来构建个业务逻辑,更清晰的理解该项目的需求,然后再设计数据库,当然数据库的表关系是最后设计的,先把数据表设计出来再说,然后再看效果,是否需要增添一些字段,或者外键关联之类的。然后在敲代码实现。

项目比较常规,围绕里面用的技术

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