1. 程式人生 > >python中前後端通訊方法Ajax和ORM對映(form表單提交)

python中前後端通訊方法Ajax和ORM對映(form表單提交)

後端從資料庫獲取資料給到前端:

第一種方式:

admin.py檔案程式碼:

@admin.route('/showList')
def show():
    # 獲取資料庫所有文章資料,得到一個個物件
    res=Article.query.all()
    dicts=[]
    # 將每一個物件轉成字典並加入一個列表,再用jinja模板將資料渲染到檢視html中
    for item in res:
        dicts.append(item.__dict__)
    print('讀取所有內容',dicts)
    print('每一個欄位的值
',dicts[0]['title']) # 將資料dicts=dicts傳到articleList.html頁面渲染 return render_template('admin/articleList.html',dicts=dicts)

前端利用jinja語法渲染:

    <!--該內容使用了jinja模板-->
                                    <div id="top">
                                            {%for item in
dicts%} <!--<form id="form1" method='POST' enctype="multipart/form-data" action="url">--> <hr/> <h3 class="zuo">作者:</h3> <p class
="biao">{{item['author']}}</p> <p class="lei">文章分類:{{item['category']}}</p> <p class="shi">文章釋出時間:{{item['put_date']}}</p> <p class="nei">文章內容:{{item['content']}}</p> <button class="authorList" id="{{item.id}}" >編輯</button> <!--這裡的data-id是設定的標籤數學,在點選不同的item時獲取它的id值,下面講解在js裡用到--> <button data-id="{{item.id}}" onclick="del(event)" type="submit" class="delete">刪除</button> <hr style="border:1rem;border-bottom-color: black"/> <!--</form>--> {% endfor %} </div>

在點選修改文章時需要知道具體是哪偏文章需要修改所以在上面用data-id將每篇文章的id儲存到設定屬性dataset裡

在js裡直接設定路由,根據相應路由程式會執行相應的py檔案下路由的函式方法:

    function del(e){
                console.log('刪除',e)
                //獲取表單設定好的data—id值
                value = e.target.dataset.id
                //本地路由定向
                location.href='/admin/delArticle/'+ value

                // console.log('/admin/delArticle/'+ value)
                //  $('form1').attr('action','/admin/delArticle/'+ value)
            }

相應路由下的py方法:

# 此處使用動態路由的方式接收前端傳來的id,根據相應的id刪除相應的文章
@admin.route('/delArticle/<delid>',methods=['GET','POST'])
def delArticle(delid):
    print('123456',delid)
    delAr=Article.query.filter(Article.id==delid).first()
    db.session.delete(delAr)
    db.session.commit()

    return render_template('admin/addArticle.html')

第二種ajax請求方式:

利用ajax傳遞前端請求的資料並返回資料給到前端:

js程式碼:

//被點選的標籤物件$('.authorList')
            $('.authorList').click(function() {
                //獲取當前點選物件標籤上的屬性id值

                var ID = $(this).attr('id')

                data = {'Articleid': ID}
                console.log(data)
                 $.ajax({
                    // ajax請求的路由地址(py檔案下的路由下有方法)
                    url: '/admin/editArticle',
                    // 向後端請求型別(是一個物件格式)
                    type: 'post',
                    // 向後端傳送請求的資料
                    data: data,
                    // 請求成功後後端返回回來的資料,後端對資料json.dumps(data)
                    success: function (res) {
                        // 後端對資料json.dumps(data)data是一個物件型別才能dumps,所以在此要對資料進行解析
                        resData=JSON.parse(res)
                        console.log(resData)
                        //將獲取到的資料渲染到相應的標籤裡
                        $('#title').val(resData.title)
                        $('#category').val(resData.category)
                        $('#author').val(resData.author)
                        $('#editText')[0].innerHTML=(resData.content)
                    }
                   })
                $('#edit')[0].style.display='block '
                $('#top')[0].style.display='none '
                $('#top')[0].style.opacity='0 !important'

            })

後端py檔案下的方法接收到資料返回資料:

@admin.route('/editArticle',methods=['post','get'])
def editArticle():
    # 定義一個全域性共用變數id(因為下面else裡要用到)
    global A_id
    print('bianjie',len(request.form))
    # 前端點選編輯時傳入的是一個id值所以長度為1,這是將所有文章內容原樣渲染到編輯頁面,得返回所有文章內容
    if len(request.form)<2:

        A_id= request.form['Articleid']
        print('獲取前端post請求資料id',request.form['Articleid'])
        resEdit=Article.query.filter(Article.id==int(request.form['Articleid'])).first()
        data={
            'title':resEdit.title,
            'author':resEdit.author,
            'content':resEdit.content,
            'category':resEdit.category,
            'files':resEdit.files
        }
        # data是一個物件型別才能dumps
        # print(resEdit.title)
        return json.dumps(data)
    
    # 否則提交回來的就是修改文章後的內容長度大於1,執行修改相應資料庫的內容
    else:

        print('修改文章', request.form)
        edit=Article.query.filter(Article.id== A_id).first()
        edit.title=request.form['title']
        edit.content = request.form['content']
        edit.category = request.form['category']
        edit.files = request.form['files']
        edit.author = request.form['author']
        edit.edit_time =datetime.now()
        db.session.commit()
        print('修改文章')
        # return redirect('/showList')
        return '完成修改'

前後端互動還有form 表單提交post或者get傳遞資訊給後端相對較簡單,在此不多加描述

哎,還是說一下:在這裡method='post' enctype="multipart/form-data"必須寫method方法可以是post也可以是get,action是表單提交到後端的具體路由,

在該路由下py執行的具體方法

<form role="form" action='/admin/addArticle' method='post' enctype="multipart/form-data">
                                    <div class="form-group">
                                        <label>文章標題</label>
                                        <input type="text" placeholder="請輸入文章標題" name="title" class="form-control">
                                    </div>
  
                                </form>

後端接收表單資訊:

@add_article.route('/',methods=['POST','GET'])
# 新增文章
def addArticle():

    return render_template('admin/form_basic.html')


@add_article.route('/add',methods=['POST','GET'])
def add():

    # print(request.method)
    if request.method=='GET':
        print('執行到此處1')
        return render_template('admin/form_basic.html')
    else:
        # 獲取使用者名稱,然後再根據使用者名稱獲取使用者id
        # 獲取session
        print('執行到此處2')
        # 獲取表單圖片檔案的方法
        img = request.files
        print('圖片',img)
        img = img['cover_img']
        # print(img.filename)
        if img !=None :
            # 獲取圖片名字
            img_name=img.filename
            # 儲存圖片到本地
            img.save('./static/images/{}'.format(img_name))
            cover_img = './static/images/{}'.format(img_name)
        else:
            cover_img = 'http://bpic.588ku.com/back_pic/04/54/42/0658634373900c4.jpg'

        # 獲取使用者賬號
        username = session.get('user_name')

        if username != None:
            check = User.query.filter(User.user_name == username).first()
            userid = check.id
            print('使用者id', userid)
        else:
            username = '失心哥'
            check = User.query.filter(User.user_name == username).first()
            userid = check.id
        #     print('出錯了,該使用者不存在')
            # return '出錯了,該使用者不存在'
        # 獲取表單提交裡面的name為title的值
        title = request.form['title']

        type = request.form['type']
        author = request.form['author']
        content = request.form['content']
        times = datetime.now()
        # 新增文章,foreign_user=userid
        addInfo=Article(title=title,cover_img=cover_img,type=type,author=author,content=content,time=times,state=1,foreign_user=userid)
        db.session.add(addInfo)
        db.session.commit()
        return render_template('admin/form_basic.html')
        # return '成功增加文章'
    
View Code