【Flask框架】

6.Flask輕量型框架

6.1Flask簡介

python提供的框架中已經寫好了一個內置的服務器,服務器中的回應response行和頭已經寫好,我們只需要自己寫顯示在客戶端,的主體body部分。
----------------------------------------------------------
Flask是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎則使用 Jinja2 。Flask使用 BSD 授權。
Flask也被稱為 “microframework” ,因為它使用簡單的核心,用 extension 增加其他功能。Flask沒有默認使用的數據庫、窗體驗證工具。
----------------------------------------------------------
WSGI接口協議:是python應用程序或框架和web服務器之間的一種接口

6.2安裝

在虛擬環境的基礎上 cmd打開命令行 workon py1901

執行 pip install Flask (自動把Werzeug和Jinja2安裝捆綁安裝)

查看 pip list

6.3MVT

在這里插入圖片描述

python提供的框架中已經寫好了一個內置的服務器,服務器中的回應response行和頭已經寫好,我們只需要自己寫顯示在客戶端,的主體body部分。
主體body中 既有css、js 又有 數據庫、python,所以mvt在主體中將他們分成了三個部分
-------------------------------------------------------------
mvt:model-------->數據庫view--------->視圖 url路由 |python代碼template----->模板  html網頁  在靜態頁面中可以寫python代碼

6.4Flask的初始化方法

def __init__(self,import_name,static_url_path=None,static_folder='static',static_host=None,host_matching=False,subdomain_matching=False,template_folder='templates',instance_path=None,instance_relative_config=False,root_path=None):

6.5路由

在這里插入圖片描述

from flask import Flask
import settingsapp = Flask(__name__)app.config.from_object(settings)#路由設置
@app.route('/')
def hello_world():return 'Hello Baby! 啦啦啦啦啦啦 app1'@app.route('/user/login/')
def login():return '用戶正在登陸.....'@app.route('/user/register/')
def register():return '用戶正在注冊.....'def order():print('您正在查看訂單.....')#打印在控制臺的return '您正在查看訂單.....'#打印在網頁的
app.add_url_rule('/orders',view_func=order)if __name__=='__main__':print(app.url_map)app.run(port=8080)
#settings.py文件中:
ENV = 'development'
DEBUG = True

可以看到響應的結果:

在這里插入圖片描述
在這里插入圖片描述

通過以上 我們可以看出 —— 定義路由的方式有兩種:

#1.使用裝飾器
@app.route('/user/login/')
def login():return '用戶正在登陸.....'@app.route('/user/register/')
def register():return '用戶正在注冊.....'
#2.通過add_url_rule實現
def 函數名():return '您正在查看訂單.....'#打印在網頁的
app.add_url_rule('路由規則',view_func=函數名)
'''
路有規則就是網址后面那個路徑 
view_func=函數名	函數名后面不加括號
'''def order():return '您正在查看訂單.....'#打印在網頁的
app.add_url_rule('/orders',view_func=order)

6.6路由的變量規則

=========================================================

默認的就是字符串規則

=========================================================

/<變量>/

from flask import Flask
import settingsapp = Flask(__name__)
app.config.from_object(settings)@app.route('/tieba/<keyword>/') #keyward是一個變量 代表著你給我什么我就傳什么
def tieba(keyword):#有<>出現了 路由的視圖函數里就必須有一個重名的參數出現return '正在看%s'  % keywordif __name__=='__main__':print(app.url_map)app.run(port=8080

=========================================================

int規則

還要設置一個第幾頁:這里涉及了一個int規則 ———— int:

from flask import Flask
import settingsapp = Flask(__name__)
app.config.from_object(settings)#如果不加int的話 page默認的類型就是字符串類型
@app.route('/tieba/<keyword>/<int:page>') #keyward是一個變量 代表著你給我什么我就傳什么
def tieba(keyword,page): #有<>出現了 路由的視圖函數里就必須有一個重名的參數出現return '正在看%s,當前是第%d頁' % (keyword,page)if __name__=='__main__':print(app.url_map)app.run(port=8080)

注釋:當裝飾器帶參數的時候

def zhuang1(wifename):def inner1(f):def inner2(*args,**kwargs):f(*args,**kwargs)print("媳婦必須像%s" % wifename)return inner2return inner1@zhuang1('賈玲')
def func2():print("好好學習,努力掙錢,娶媳婦!")if __name__ == '__main__':func2()'''
如果裝飾器帶參數
必須要定義三層
'''

=========================================================

float規則

rom flask import Flask
import settingsapp = Flask(__name__)
app.config.from_object(settings)@app.route('/tieba/<keyword>/<float:score>')
def tieba2(keyword,score):str = '正在看的節目是{},評分是{}.2f '.format (keyword,score)#.2f表示的是小數點后保留2位return strif __name__=='__main__':print(app.url_map)app.run(port=8080)

path規則

from flask import Flask
import settingsapp = Flask(__name__)
app.config.from_object(settings)@app.route('/tieba/<path:pathname>')
def tieba2(keyword,pathname):return pathname
#http://127.0.0.1:8080/tieba/快樂大本營/9a/b
#拿到的值就是:快樂大本營/9a/bif __name__=='__main__':print(app.url_map)app.run(port=8080)

=========================================================

下面介紹的是使用變量規則

'''使用路由:
1. 變量規則:@app.route('/tieba/<keyword>/<int:page>')def tieba(keyword, page):print(type(keyword))  # 默認strprint(type(page))return '正在看:%s,當前是第%d頁' % (keyword, page)轉換器的類型:int  float  path  默認:str

======================================================

6.7get請求參數傳參

from flask import Flask, requestimport settingsapp = Flask(__name__)app.config.from_object(settings)#超鏈接和直接拼接在地址欄后面參數,使用的都是get請求
# 使用get請求的參數
# http://127.0.0.1:8080/tieba/?keyword=快樂大本營
@app.route('/tieba/')
def tieba():# get請求print(request.args)  # 請求參數,都存放在args,底層就是一個ImmutableMultiDict字典對象keyword = request.args.get('keyword')page = request.args.get('page')print('page是:'+page)# keyword = '快樂大本營'return '正在看:%s' % (keyword)# http://127.0.0.1:8080/tieba/?keyword=runningman&page=100if __name__ == '__main__':print(app.url_map)app.run(port=8080)

控制臺輸入 page=100

在這里插入圖片描述

6.8Request對象

小知識

dict={}value = dict.get('keyword')
print(value)			#----->Nonevalue2 = dict.get('keyword','nba')
print(value2)			#----->nba'''
value3 = dict ['keyword']
print(value3)              #----->這種方法報錯
'''

先定義一個空字典 取不出來值的話就是none,如果有默認值就是nba


request對象的源代碼

current_app = LocalProxy(_find_app)
request = LocalProxy(partial(_lookup_req_object, 'request'))
session = LocalProxy(partial(_lookup_req_object, 'session'))
g = LocalProxy(partial(_lookup_app_object, 'g'))
from flask import Flask, request
import settingsapp = Flask(__name__)
app.config.from_object(settings)@app.route('/f')
def hello_world():#request對象已經產生,request:請求行、請求頭、請求體#http://127.0.0.1:5000/f?kw=abc&page=1print(request.base_url)     #http://127.0.0.1:5000/fprint(request.full_path)    #/f?kw=abc&page=1print(request.path)         #/fprint(request.args)         #args就是arguments的縮寫 ImmutableMultiDict([('kw', 'abc'), ('page', '1')])value=request.args.get('kw','nba')return 'Hello World!————>' + valueif __name__ == '__main__':app.run()

6.8.1超鏈接

如果有一個表單該怎么做呢?

在template里new一個tieba.html文件:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>tieba</title>
</head>
<body><a href="/zy">快樂大本營</a>{#如果這里沒有/ 但是app.py里的zy后面有/ 那么就重定向到runningman#}<a href="/zy/?kw=歡樂喜劇人">歡樂喜劇人</a><a href="/zy/?kw=王牌對王牌">王牌對王牌</a><a href="/zy/?kw=極限挑戰">極限挑戰</a><a href="/zy/?kw=奔跑吧兄弟">奔跑吧兄弟</a>
</body>
</html>

app.py文件:

from flask import Flask,render_template,request
import settingsapp = Flask(__name__)
app.config.from_object(settings)@app.route('/zy')
def zongyi():return render_template('tieba.html') #模板渲染@app.route('/zy/') #/zy后面如果有/ 那么tieba.html里的請求路徑的zy后面也要有
def zy():value = request.args.get('kw','runningman')return '正在看%s' % valueif __name__ == '__main__':app.run()

點擊歡樂喜劇人:

在這里插入圖片描述

上面的是超鏈接頁面

接下來我們進入表單頁面

6.8.2表單

在template里新建一個comment.html文件:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>評論</title>
</head>
<body>
<form action="/comment/" method="post">
{#    1、method="get"方法的使用方式如下:#}
{#    http://127.0.0.1:8080/comment=aaa123#}
{#    2、記住!!!開發的時候 所有的表單相關的涉及到提交的#}
{#    都要用post 因為地址欄的長度是有限的 不可能把所有的東西都寫在上面#}
{#    也有很多機密性的東西容易被截獲 被別人看到#}
{#    所以對于表單的東西都要用post#}<p><input type="text" name="comment"></p><p><input type="submit" value="評論"></p>
</form>
</body>
</html>

app.py文件:

from flask import Flask,render_template,request
import settingsapp = Flask(__name__)
app.config.from_object(settings)#所有超級鏈接發出的都是GET請求,地址欄上直接輸入的也是GET請求
#下面點擊按鈕的是POST請求
@app.route('/comment/',methods=['POST','GET'])
# 如果想讓POST和GET都進入來 需要開門 在app.route里設置
def comment():print(request.method)if request.method == 'GET':return render_template('comment.html')elif request.method == 'POST':return '呵呵'if __name__ == '__main__':print(app.url_map)app.run(host='0.0.0.0')

在這里插入圖片描述
上面我們只是回復了一個呵呵 那么我們該怎么接收表單的數據呢?

request.form.get(‘comment’)

from flask import Flask,render_template,request
import settingsapp = Flask(__name__)
app.config.from_object(settings)#所有超級鏈接發出的都是GET請求,地址欄上直接輸入的也是GET請求
#下面點擊按鈕的是POST請求
@app.route('/comment/',methods=['POST','GET'])
# 如果想讓POST和GET都進入來 需要開門 在app.route里設置
def comment():print(request.method)if request.method == 'GET':return render_template('comment.html') #展示給用戶的部分elif request.method == 'POST':#從post里取值print(request.form)values =request.form.get('comment')#獲取用戶的提交部分return '呵呵——————>' + valuesif __name__ == '__main__':print(app.url_map)app.run(host='0.0.0.0')

6.8.3request總結

直接導入使用:
request ----> from flask import request

request.args.get() ----> 獲取get的請求參數
request.form.get() ----> 獲取post的提交數據
request.method ----> 模板(template) ---->render_template(模板名稱) 注意@app.route(‘/comment/’,methods=[‘POST’,‘GET’])
request.path
request.full_path
request.cookies ----> 會話機制
request.files ----> 文件上傳

6.9Response

response:

響應行 (協議、狀態)

響應頭 (響應的類型、響應的內容的字節、服務器是什么)

響應體 (給用戶的)

四種響應

1、直接return 字符串

直接來一個字符串str 怎么就能變成response對象呢?

雖然反回的是一個字符串 但是底層當中就把字符串放到響應體中 構成

一個完整的response 再把完整的response返回出去
在這里插入圖片描述

2、return 渲染模板

渲染模板能轉成字符串嗎?可以 —— render_template_string

from flask import Flask,render_template,request,render_template_string

在template里新建test.html文件:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1><div><p><span>哈哈哈哈哈哈</span></p></div>
</h1>
</body>
</html>

app.py文件:

from flask import Flask,render_template,request,render_template_string
import settingsapp = Flask(__name__)
app.config.from_object(settings)@app.route('/movie')
def movie():s= render_template('test.html')return sif __name__ == '__main__':print(app.url_map)app.run(host='0.0.0.0')
3、自己建一個 make_response

能轉化成一個response對象嗎?可以 —— make_response

from flask import Flask,render_template,request,make_response
import settingsapp = Flask(__name__)
app.config.from_object(settings)@app.route('/movie')
def movie():#響應體response = make_response('喜歡看:驚奇隊長')#有了響應體,就要加響應頭# response.headers ['Server']='Flask Inner Server'#常用的頭:response.headers ['Cookies'] = ''#獲得默認的服務器名字:Server: Werkzeug/0.14.1 Python/3.6.5return responseif __name__ == '__main__':print(app.url_map)app.run(host='0.0.0.0')
4、return 字典對象

Jsonify —— 底層就是用 dumps/序列化 完成的

from flask import Flask,render_template,request,jsonify,json
import settingsapp = Flask(__name__)
app.config.from_object(settings)@app.route('/music')
def music():data = {'name':'麻煩豆腐','author':'張藝興','country':'中國'}# return jsonify(data)return json.dumps(data)#在網頁端的Network我們可以看到:#jonify之后 把字典轉化成了Json類型——Content-Type:application/json#json.dumps 轉為了字符串的類型——Content-Type: text/html; charset=utf-8if __name__ == '__main__':print(app.url_map)app.run(host='0.0.0.0')

結果:

jsonify( ):

在這里插入圖片描述

json.dump( ):
在這里插入圖片描述
Jonify和Json.dump的區別:

jsonify(data) ---->底層使用 json.dumps(data) —> 轉為str ----> response = make_response(str) response.headers[‘Content-Type’]=‘application/json’----> 最后拋出的response就是JSONResponse

json.dumps(data)

他們的關系就是Jsonify使用了json.dumps(data)

總結

總結: response

  1. 直接 return 字符串

  2. render_template(‘模板名稱’)

  3. make_response(…)

  4. jsonify(data)

小知識:列表一樣可以被轉成字符串或者是json類型

from flask import Flask,render_template,request,jsonify,json
import settingsapp = Flask(__name__)
app.config.from_object(settings)@app.route('/music')
def music():Alist=['Alone','Billion','helloworld']# return jsonify(Alist)return json.dumps(Alist)if __name__ == '__main__':print(app.url_map)app.run(host='0.0.0.0')

6.10模板 template

模板引擎:Jinjia2

Flask 使用 Jinja 2 作為模板引擎。當然,你也可以自由使用其它的模板引擎,但運行 Flask 本身仍然需要 Jinja2 依賴 ,這對啟用富擴展是必要的,擴展可以依賴 Jinja2 存在。

Jinja 2 默認配置如下:

  • 所有擴展名為 .html.htm.xml 以及 .xhtml 的模板會開啟自動轉義
  • 模板可以利用 {% autoescape %} 標簽選擇自動轉義的開關。
  • Flask 在 Jinja2 上下文中插入了幾個全局函數和助手,另外還有一些目前默認的值
{# xml小簡介:
所有的標簽都是自己寫的文件 新建一個test.xml文件 #}<school><name>Echo</name><address>1111</address><classes><class><name>python111</name></class><class><name>python222</name></class><class><name>python333</name></class><class><name>python444</name></class></classes>
</school>{# xml最大的作用就是:以上面的格式來保存數據 #}{#
xml和json都是輕量級數據傳輸方式:
數據量不大 不需要都放在數據庫里 直接寫在這就可以json:{name:'',address:''classes:[{},{},{},......]}#}

舉一個JSON的例子:
打開淘票票網站
右鍵檢查 看Network
然后選擇XHR 就是ajax的對象
鼠標往北京那個點一放 發現多了一行
點擊那一行 可以看到response里面都是json數據
復制之后打開bejson網站 進行解析
在這里插入圖片描述
在這里插入圖片描述

現在都常用JSON 不用xml 為什么?

因為xml里面都是標簽 需要封裝成一個DOM對象 DOM對象層層去找 就比較麻煩 所以用JSON更方便

渲染模板

{{ name }} ————> 獲取渲染的變量的值

render_template(‘base.html’,name=name,name1=name1) # 模板渲染 ——> xxx.html {{name}} 模板引擎

在template里新建一個base.html文件:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>base</title>
</head>
<body>
{#html + 模板語言 ————> 模板 模板引擎負責翻譯模板語言#}<h1>BASE</h1><hr>{{ name1 }}<hr>{{ name2 }}<hr>{{ names }}<hr>{{ name3 }} app里沒有傳name3 name3沒有取到就不顯示 也不報錯
</body>
</html>

app.py文件里:

from flask import Flask,render_template,request,jsonify,json
import settingsapp = Flask(__name__)
app.config.from_object(settings)@app.route('/')
def show_base():actor1 = '葫蘆娃' #現在想把這個name傳到html頁面 怎么做?actor2 = '葫蘆兄弟'names = ['葫蘆娃','迪迦奧特曼','喜洋洋','小豪']return render_template('base.html',name1=actor1,name2=actor2,names=names) #渲染模板 這里才是真正的渲染到頁面上if __name__ == '__main__':print(app.url_map)app.run(host='0.0.0.0')

在這里插入圖片描述

結果:
在這里插入圖片描述

可以看到names本來是列表 傳出來是字符串 我們想遍歷把數據一條一條的取出來

但是類型是字符串 那么我們該怎么辦?

需要使用:

遍歷 FOR

語句:iffor{% for  xxx  in  xxx %}{% endfor %}

app.py文件里新添加一個類對象、一個dict字典格式用于測試:

from flask import Flask,render_template,request,jsonify,json
import settingsapp = Flask(__name__)
app.config.from_object(settings)class Student:def __init__(self,name,age):self.name = nameself.age  = agedef __str__(self):return self.name@app.route('/')
def show_base():actor1 = '葫蘆娃' #現在想把這個name傳到html頁面 怎么做?actor2 = '葫蘆兄弟'names = ['葫蘆娃','迪迦奧特曼','喜洋洋','小豪']data = {'name':'麻婆豆腐','author':'張藝興','country':'中國','number':10000}stu = Student('徐小偉',2)return render_template('base.html',name1=actor1,name2=actor2,names=names,data=data,student=stu) #渲染模板 這里才是真正的渲染到頁面上if __name__ == '__main__':print(app.url_map)app.run(host='0.0.0.0')

base.html文件:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>base</title>
</head>
<body>
{#html + 模板語言 ————> 模板 模板引擎負責翻譯模板語言#}<h1>BASE</h1><hr>{{ name1 }}<hr>{{ name2 }}<hr>{{ names }}<hr>{#遍歷列表的值#}{% for num in names %}<p>{{ num }}</p>{% endfor %}<hr>{# 取出列表的具體某個值 推薦使用.的方式 #}{{ names[2] }}{{ names.2  }}<hr>{#遍歷字典的值#}{% for vim in data.values() %}<p>{{ vim }}</p>{% endfor %}<hr>{#遍歷字典的鍵值對#}{% for k,v in data.items() %}<p>{{ k }}-----{{ v }}</p>{% endfor %}<hr>{# 取字典的某個具體值 #}{{ data.name }}{{ data.country }}<hr>{#類對象#}學生的名字是:{{ student }}學生的年齡是:{{ student.age }}</body>
</html>

來一個復雜的:把下面的數據放入一個個小格子里?

'bname': 'flask精通',
'price': 50,
'author': 'Echo'

app.py文件里:

from flask import Flask,render_template,request,jsonify,json
import settingsapp = Flask(__name__)
app.config.from_object(settings)datas = ({'bname': 'flask精通','price': 50,'author': '汪涵'},{'bname': 'java從入門到放棄','price': 88,'author': '徐小偉'},{'bname': 'Linux菜鳥教程','price': 56,'author': '張富貴'},{'bname': '曼巴自傳','price': 50,'author': '科比'}
)@app.route('/books/')
def show_books():return render_template('books.html',allbooks=datas)if __name__ == '__main__':print(app.url_map)app.run(host='0.0.0.0')

books.html文件里:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>所有書籍</title>
</head>
<body><table border="1" cellpadding="0" width="50%">{% for book in allbooks %}<tr><td>{{ loop.index }}</td>{#loop循環 loop.index 獲取循環的次數#}{#loop.index0表示從0開始 loop.revindex表示序號反轉#}<td>{{ book.bname }}</td><td>{{ book.price }}</td><td>{{ book.author}}</td><td><a href=""#>刪除</a><a href="#">更新</a></td></tr>{% endfor %}
</table><hr></body>
</html>

條件判斷 IF

實現和百度貼吧下面頁碼一樣的效果 在哪一頁 哪一頁就沒有邊框

在這里插入圖片描述
books.html文件:

!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>IF的使用</title><style>#box a{color: black;border: 1px solid gray;padding: 5px;text-decoration: none;margin-right: 3px;}</style></head>
<body>{#if else的使用#}
if的使用場景:
{% if school=='echo教育' %}{{ school }}
{% else %}匹配不成功
{% endif %}<hr><div id="box" ><a href="/books/?page=1" {% if page==1 %}style="border: none" {% endif %}>1</a><a href="/books/?page=2" {% if page==2 %}style="border: none" {% endif %}>2</a><a href="/books/?page=3" {% if page==3 %}style="border: none" {% endif %}>3</a><a href="/books/?page=4" {% if page==4 %}style="border: none" {% endif %}>4</a><a href="/books/?page=5" {% if page==5 %}style="border: none" {% endif %}>5</a>
</div></body>
</html>

app.py文件:

from flask import Flask,render_template,request,jsonify,json
import settingsapp = Flask(__name__)
app.config.from_object(settings)@app.route('/books/')
def show_books():page = request.args.get('page',1)#默認在第一頁 1沒有邊框print(type(page))# http: // 127.0.0.1:5000/book/?page = 3# 傳過來的值是字符串 str ‘3’ 需要轉化為整型return render_template('books.html',school='echo教育',page=int(page))if __name__ == '__main__':print(app.url_map)app.run(host='0.0.0.0')

6.11模板繼承

為什么要用模板繼承?

有A、B、C三個頁面 但是三個頁面的頭尾都是一樣的

extends

A:頭。。。。。。尾

B:頭。。。。。。尾

C: 頭。。。。。。尾

提取公共部分:
父模板中
子模板繼承父模板

步驟:

1. 定義父模板parent.html在父模板中“挖坑”{% block  名字%}{%endblock%}作為一個父模板: 至少4個坑   title   css   content  js
2. 子繼承父模板:{% extends  'parent.html'  %}在子模板中‘填坑’{% block  名字%}填充內容{%endblock%}
3. 使用模板:render_template('news.html')

在template里新建一個parent.html文件

百度bootstrap的文檔找到css樣式里的導航條代碼,復制到body里

因為里面有許多類不能用,所以在起步里找CDN加速服務 添加到head里

parent.py:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{% block title %}父模板{% endblock %}</title><!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"><!-- 可選的 Bootstrap 主題文件(一般不用引入) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"><!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</head>
<body>
<nav class="navbar navbar-default"><div class="container-fluid"><!-- Brand and toggle get grouped for better mobile display --><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">Brand</a></div><!-- Collect the nav links, forms, and other content for toggling --><div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"><ul class="nav navbar-nav"><li class="active"><a href="#">首頁 <span class="sr-only">(current)</span></a></li><li><a href="#">新聞</a></li></ul></li></ul><form class="navbar-form navbar-left"><div class="form-group"><input type="text" class="form-control" placeholder="Search"></div><button type="submit" class="btn btn-default">搜索</button></form><ul class="nav navbar-nav navbar-right"><li><a href="#">登陸</a></li><li><a href="#">注冊</a></li></ul></li></ul></div><!-- /.navbar-collapse --></div><!-- /.container-fluid -->
</nav>
</body>
</html>

app.py:

from flask import Flask,render_template,request,jsonify,json
import settingsapp = Flask(__name__)
app.config.from_object(settings)@app.route('/news/')
def show_news():return render_template('parent.html')if __name__ == '__main__':print(app.url_map)app.run(host='0.0.0.0')

然后進入127.0.0.1:5000/news/ 我們可以看到一個有導航條的頁面

然后在template再新建一個頁面 index.html

{#想把父類里的東西都繼承過來 怎么拿呢#}
{% extends ‘parent.html’ %}

這個時候 再把 app.py里面的 render_template(‘parent.html’)改為render_template(‘index.html’)

from flask import Flask,render_template,request,jsonify,json
import settingsapp = Flask(__name__)
app.config.from_object(settings)@app.route('/news/')
def show_news():return render_template('index.html')if __name__ == '__main__':print(app.url_map)app.run(host='0.0.0.0')

但是網站的標題還是“父模板”

可以在index.html里面更改網頁名為“首頁”

{#想把父類里的東西都繼承過來 怎么拿呢#}
{% extends 'parent.html' %}
{% block title %}
首頁
{% endblock %}

再添加個body

{#想把父類里的東西都繼承過來 怎么拿呢#}
{% extends 'parent.html' %}
{% block title %}
首頁
{% endblock %}<body>
<h1>這個是首頁</h1>
</body>

但是我們刷新網頁發現沒有顯示“這個是首頁”

為什么呢?因為我們是繼承的父模板 父模板里面我們除了寫導航條 沒有預留其他body

那么我們去父模板parent.html文件里面挖坑 留下位置

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{% block title %}父模板{% endblock %}</title><!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"><!-- 可選的 Bootstrap 主題文件(一般不用引入) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"><!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</head>
<body>
<nav class="navbar navbar-default">.......
</nav>
{% block content %}{% endblock %}
</body>
</html>

然后再更改index.html文件的內容:

{#想把父類里的東西都繼承過來 怎么拿呢#}
{% extends 'parent.html' %}{% block title %}
首頁
{% endblock %}{% block content %}
<body>
<h1>這里是首頁</h1>
<input type='button' value='測試'>
</body>
{% endblock %}

再進入網頁 127.0.0.1:5000/news/ 我們可以看到顯示了"這里是首頁"和一個測試按鈕

所以如果我們要做父模板 一定要把坑挖好 方便子代來填坑!!!

我們在template里再新建一個news.html文件 同樣是繼承parent.html文件

{% extends 'parent.html' %}{% block title %}新聞
{% endblock %}{% block content %}<ul><li>學校食堂食物過期</li><li>北京明天有風</li><li>偉哥高薪就業 年薪百萬</li><li>范冰冰繳稅成功</li><li>吳秀波案件反轉</li></ul>
{% endblock %}

app.py文件里做一些更改:

from flask import Flask,render_template,request,jsonify,json
import settingsapp = Flask(__name__)
app.config.from_object(settings)@app.route('/index/')
def show_index():return render_template('index.html')@app.route('/news/')
def show_news():return render_template('news.html')if __name__ == '__main__':print(app.url_map)app.run(host='0.0.0.0')

進入http://127.0.0.1:5000/index/頁面

我們可以看到:
在這里插入圖片描述
進入http://127.0.0.1:5000/news/頁面

我們可以看到:
在這里插入圖片描述

如果想給index里的input標簽加樣式 應該怎么加樣式?

不能直接加在

{% block content %}

? …

{% endblock %}

因為block content是在body里的 scrtipt需要加在head里

所以繼續去parent.html的head里挖坑

<!DOCTYPE html>
<html lang="en">
<head>......{% block mycss %}{% endblock %}</head><body>
<nav class="navbar navbar-default">......
</nav>{% block content %}{% endblock %}</body></html>

再給按鈕加一個點擊腳本事件 這個坑挖在parent.html最后 因為最后的地方把前面都加載完了

加載完了肯定能找到對象

<!DOCTYPE html>
<html lang="en">
<head>......{% block mycss %}{% endblock %}</head><body>
<nav class="navbar navbar-default">......
</nav>{% block content %}{% endblock %}{% block myjs %}{% endblock %}</body>
</html>

在index.html進行修改:

{#想把父類里的東西都繼承過來 怎么拿呢#}
{% extends 'parent.html' %}{% block title %}
首頁
{% endblock %}{% block mycss %}<style>#box{width: 200px;height: 200px;background-color: red;}</style>
{% endblock %}{% block myjs %}<script>btn = document.getElementById('btn')btn.onclick = function(){alert('aaaa——————>')}</script>
{% endblock %}{% block content %}<div id="box"></div>
<h1>這里是首頁</h1>
<input type='button' value='測試' id="btn">{% endblock %}

進入127.0.0.1:5000/index/ 點擊按鈕

在這里插入圖片描述

還可以去給news.html加樣式

{% extends 'parent.html' %}{% block title %}新聞
{% endblock %}{% block content %}<ul><li>學校食堂食物過期</li><li>北京明天有風</li><li>偉哥高薪就業 年薪百萬</li><li>范冰冰繳稅成功</li><li>吳秀波案件反轉</li></ul>
{% endblock %}{% block mycss %}<style>ul{list-style: none;}li{font-size: 20px;color: green;margin-bottom: 10px;}</style>
{% endblock %}

可以看到每條新聞前面的點沒有了:
在這里插入圖片描述

繼承的總結

步驟:

  1. 定義父模板parent.html

    在父模板中“挖坑”

    {% block 名字%}

    {%endblock%}

    作為一個父模板: 至少4個坑 title css content js

以后工作的話 對接前端的人 看一下他寫的網頁的結構
比如他的網頁的結構式左中右三個大內容
就可以在body里面挖三個坑
{% block content1 %}
{% endblock %}{% block content2 %}
{% endblock %}{% block content3 %}
{% endblock %}
  1. 子繼承父模板:
    {% extends ‘parent.html’ %}

    在子模板中‘填坑’

    {% block 名字%}
    填充內容

    {%endblock%}

  2. 使用模板:

    render_template(‘news.html’)

6.12項目結構的搭建

查看筆記《flask項目的搭建》

6.13數據添加

用戶注冊

template模板中的register.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用戶注冊</title>
</head>
<body>
<h3>用戶注冊</h3>
<form action="{{ url_for('user.register') }}" method="post"><p><input type="text" name="username" placeholder="輸入用戶名"></p><p><input type="password" name="password" placeholder="輸入密碼"></p><p><input type="password" name="repassword" placeholder="輸入確認密碼"></p><p><input type="submit" value="注冊"></p>
</form>
<p style="color:red">{{ msg }}</p>
</body>
</html>

views視圖中的python代碼:

在views包中的user_view.py文件中:
import hashlibfrom flask import Blueprint, request, render_template, redirect, url_for
from sqlalchemy import or_, and_, funcfrom app.models.user_model import User
from exts import dbuser_bp = Blueprint('user',__name__,url_prefix='/user')@user_bp.route('/register',methods=['GET,'POST'])
def register():if request.method=='GET':return render_template('register.html')else:                                # 獲取輸入username = request.form.get('username')password = request.form.get('password')repassword = request.form.get('repassword')if password != repassword:return render_template('register.html', msg='兩次密碼不一致')# 數據庫添加# 創建對象Useruser = User()user.username = usernameuser.password = hashlib.sha256(password.encode('utf-8')).hexdigest()  # 明文  123456# 添加到db上db.session.add(user)# 提交事務db.session.commit()return '注冊成功'                        

用戶登錄

template模板中的login.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用戶登錄</title>
</head>
<body>
<h3>用戶登錄</h3>
<form action="{{ url_for('user.login') }}" method="post"><p><input type="text" name="username" placeholder="輸入用戶名"></p><p><input type="password" name="password" placeholder="輸入密碼"></p><p><input type="submit" value="登錄"></p>
</form>
<p style="color:red">{{ msg }}</p>
</body>
</html>

views視圖中的python代碼:

在views包中的user_view.py文件中添加路由:
@user_bp.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'GET':return render_template('login.html')else:# 獲取提交的數據username = request.form.get('username')password = request.form.get('password')# 去數據庫中查詢user = User.query.filter_by(username=username).first()if user:# print(user.password)hash_pwd = hashlib.sha256(password.encode('utf-8')).hexdigest()if user.password == hash_pwd:print(url_for('user.show'))  # /user/showreturn redirect(url_for('user.show'))# return render_template('show.html')return render_template('login.html', msg='用戶名或者密碼有誤!')

展示用戶信息show

template模板中的show.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用戶信息展示</title>
</head>
<body>
<h4>用戶信息如下:</h4>
<table border="1" cellspacing="0" width="40%"><tr><th>序號</th><th>用戶名</th><th>注冊時間</th><th>是否刪除</th><th>操作</th></tr>{% for user in users %}<tr><td>{{ loop.index }}</td><td><a href="{{ url_for('user.articles') }}?id={{ user.id }}">{{ user.username }}</a></td><td>{{ user.add_time }}</td><td>{{ user.isdelete }}</td><td>{#                <a href="{{ url_for('user.delete',id=user.id) }}">刪除</a>#}{#      {{ url_for('user.delete') }}  ---> /user/delete?id=2            #}<a href="{{ url_for('user.delete') }}?id={{ user.id }}">刪除</a><a href="#">更新</a></td></tr>{% endfor %}</table></body>
</html>

注:url_for:反向解析

views視圖中的python代碼:

@user_bp.route('/show')
def show():# 給管理員展示所有的用戶信息# users = User.query.filter_by(isdelete=False).all()  # 查詢表中所有的數據   select * from user where isdelete=0users = User.query.all()print(users)return render_template('show.html', users=users)

數據刪除

views視圖中的python代碼:

@user_bp.route('/delete')
def delete():# 邏輯刪除,修改isdelete的值id = request.args.get('id')user = User.query.filter_by(id=id).first()user.isdelete = Truedb.session.commit()#  db.session.delete(user)   db.session.commit()return redirect(url_for('user.show'))

注:物理刪除

1.對象
2. db.session.delete(對象)
3. db.session.commit()

數據查詢

查詢:
User.query.filter(User.username.contains(‘admin123’)).all()
User.query.filter(User.username.contains(‘admin123’)).first()
User.query.filter(User.username.contains(‘admin123’)).count()
User.query.filter(User.username.contains(‘admin123’)).order_by(-User.age)

User.query.all() ---->切片[1:5]

User.query.get(id)

and_ or_

template模板中的search.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>展示查詢結果</title>
</head>
<body>
{#{{ user.username }} ---- {{ user.add_time }}#}
{{ users }}
{% if users %}{% for user in users %}<p>{{ user.username }}-----{{ user.age }}</p>{% endfor %}

views視圖中的python代碼:

@user_bp.route('/search/<int:id>')
def search(id):# User.query.all()   查詢所有信息# get(value)  ---> 表示 根據主鍵獲取用戶對象# user = User.query.get(id)  # user = User.query.filter_by(id=1).first()# user = User.query.filter_by(username='admin123',#                             isdelete=True).first()  # select * from user where username='admin123' and isdelete=False# print(user)  # 返回值None# users = User.query.filter(and_(User.age>18, User.username.contains('a'))).all()# users = User.query.filter(User.age.between(18,25)).all()# or_  and_        只有字符串字段才可以使用startswith   endswith   contians  like  betweencount = User.query.filter(User.age >= 18).count()print('===========>', count)result = db.session.query(func.min(User.age).label('avg_age')).one()print("====>%s" % result)# users = User.query.filter(User.age>=18).order_by(-User.age).limit(3).all()users = User.query.filter(User.age >= 18).order_by(-User.age).all()[1:3]  # 使用切片return render_template('search.html', users=users)

6.14redirect重定向

return redirect(url_for(‘user.show’))----------->重定向

return render_template(‘show.html’)---------->服務器內部獲取模板信息返回

區別:

? 1.重定向 地址欄發生改變,第二種方式是沒有改變的

? 2.重定向 攜帶狀態嗎302到達客戶端瀏覽器,瀏覽器獲取狀態碼302之后修改地址欄的url為:location的值 /user/show,http://127.0.0.1:5000/user/show ,瀏覽器發出修改后的url的請求。

6.15 一對多關系

lass User(db.Model):id=xxxname=xxx# relationship    #backref反向查找articles = db.relationship('Article',backref='user')class Article(db.Model):id=xxxtitle=xxx添加外鍵user_id = db.Column(db.Integer,db.ForeignKey('user.id'))user.articlesarticle.user

6.16多對多

User  -- goodsstudent -- courseuser  ---  movie第一: user模型和goods模型都是獨立,建立兩者關系第二:  創建兩張表的關系表:就是建立關系(通過外鍵)class User_goods(BaseModel):__tablename__ = 'user_goods'user_id = db.Column(db.Integer, db.ForeignKey('user.id'))goods_id = db.Column(db.Integer, db.ForeignKey('goods.id'))另外的方式:tags = db.Table('tags',db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True),db.Column('page_id', db.Integer, db.ForeignKey('page.id'), primary_key=True)
)第三: goods = db.relationship('Goods',backref='users',secondary='關系表的表名')

6.17Cookie和Session

cookie

會話機制:http
無狀態協議。Cookie:設置Cookie:通過response對象完成設置:得到response對象:make_response()Response()   text/htmlredirect()jsonify()   application/jsonresponse.set_cookie(key,value)  ----->設置到客戶端的瀏覽器key=value獲取cookie:通過request對象: 只要發出請求,就會默認攜帶cookie   127.0.0.1request.cookies.get(key)  ----> value刪除cookie:通過response對象:response.delete_cookie(key)  -----> 刪除key對應的鍵值對設置cookie的過期時間expires = datetime.now()+timedelta(days=30)   -----> 時間差
res.set_cookie('flag', 'hello',expires=expires)
res.set_cookie('kkk',18,max_age=60)   -----> max_age單位是秒

session

Session:
必須在配置文件中設置secret_key
SECRET_KEY='dhfjh244djsqopfv5790874878jchfjh'設置session:
session['uname']='admin123'
在配置文件中:
SECRET_KEY = 'dhfjh244djsqopfv5790874878jchfjh'
PERMANENT_SESSION_LIFETIME = timedelta(hours=1)獲取session:
session.get('uname')  ---->value退出:session.clear()

6.18鉤子函數

flask 鉤子函數: django 中表示 中間件鉤子函數:app.route('/')
def index():pass@app.before_first_request()
def 函數():完成@app.before_request
def 函數():pass@app.after_request
def 函數():pass@app.teardown_request
def 函數():pass

6.19文件上傳

1.設置表單內容:<form action="" method="post" enctype="multipart/form-data">    ----》 必須添加enctype屬性為:multipart/form-data<p><input type="hidden" name="id" value="{{ user.id }}"></p><p><input type="text" name="username" value="{{ user.username }}"></p><p><input type="text" name="age" value="{{ user.age }}"></p>{% if not user.icon %}<p><input type="file" name="icon"></p>{% else %}<p><input type="text" name="icon" value="{{ user.icon }}"></p>{% endif %}<p><input type="submit" value="保存設置"></p></form>
--------------------------------------------------------------
2. 后臺獲取內容:# 文件上傳的icon_obj = request.files.get('icon')  # FileStorage:可以通過該對象獲取文件名: icon_obj.filename也可以通過該對象保存文件: icon_obj.save(保存文件的路徑)文件路徑的設置:在settings中設置BASE_DIR = os.path.dirname(__file__)UPLOAD_DIR = os.path.join(BASE_DIR, 'app/static/upload')保存文件:uploadpath = os.path.join(UPLOAD_DIR, icon_obj.filename)icon_obj.save(uploadpath)
--------------------------------------------------------------
3. 獲取文件:可以通過保存的路徑截取:username = session.get('uname')if username:user = User.query.filter(User.username == username).first()if user.icon:filename = user.icon.rsplit('\\', 1)[1]return render_template('index.html',filename=filename)

6.20Redis緩存

redis緩存:
1. pip install  redispip install  flask-caching2. exts ---> __init__.pycache = Cache()3. 在app初始化:cache.init_app(app=app,config=settings.REDIS_CONFIG)字典類型配置settings:REDIS_CONFIG = {'CACHE_TYPE': 'redis','CACHE_REDIS_HOST': '127.0.0.1','CACHE_REDIS_PORT': 6379,'CACHE_REDIS_DB': 1}
4. 使用cache對象:添加緩存A. cache.set(key,value,timeout=60)cache.get(key)  --->valueB. 緩存視圖函數:@app.route("/")@cache.cached(timeout=50)def index():return render_template('index.html')二:加密方式:1. 使用內置的方式加密generate_password_hash(password) ---》 加密后的結果check_password_hash(加密過得,明文的密碼)2. 使用hashlib中的加密算法加密:hash_obj = hashlib.sha256(password.encode('utf-8'))通過加密對象,獲取十六進制hash_obj.hexdigest()三、ajax的使用:$(function () {$('#username').blur(function () {$input = $(this);var username = $input.val();var $span = $('#tips');{# get請求的ajax    $.ajax()    $.post()  $.get()   $.getJSON() #}$.getJSON('/user/checkuname', {username: username}, function (data) {if (data.status == 200) {if (data.msg == 'ok') {$span.html('此用戶名可用')} else {$span.html(data.msg)}} else {alert('用戶名檢查失敗')}})})})mkvirtualenv django1901pip install django==2.0pip install pymysql

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12485.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12485.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12485.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Blob數據類型

Blob&#xff08;Binary Large Object&#xff09;是一種二進制大對象的數據類型&#xff0c;用于存儲大量的二進制數據&#xff0c;比如圖片、視頻、音頻等。Blob對象通常用于處理從網絡上獲取的數據或者在瀏覽器中生成的數據&#xff0c;例如通過用戶上傳的文件、從服務器下載…

Android Studio無法使用Google翻譯問題記錄

背景 其實關于Google翻譯不能用的問題已經出現很久了&#xff0c;之前Google關掉了很多國內的一些Google服務&#xff0c;但是Google翻譯還是能用的&#xff0c;直到不知什么時候起&#xff0c;Google翻譯也不能用呢。 每次換電腦安裝完AS后第一件事就是下載插件 Settings-Pl…

探索智慧生活:百度Comate引領人工智能助手新潮流

文章目錄 百度Comate介紹1. 什么是百度Comate&#xff1f;主要特點 2. Comate的核心功能智能問答功能語音識別功能語音助手功能個性化服務 3. Comate 支持哪些語言&#xff1f; 使用教程(以vscode為例)1. 下載和安裝Comate3. 常用操作快捷鍵(windows) 使用體驗自然語言生成代碼…

Gitlab、Redis、Nacos、Apache Shiro、Gitlab、weblogic相關漏洞

文章目錄 一、Gitlab遠程代碼執行&#xff08;CVE-2021-22205&#xff09;二、Redis主從復制遠程命令執行三、Nacos認證繞過漏洞&#xff08;CVE-2021-29441&#xff09;四、Apache Shiro認證繞過漏洞&#xff08;CVE-2020-1957&#xff09;五、Gitlab任意文件讀取漏洞&#xf…

3.TCP的三次握手和四次揮手

一、前置知識 TCP是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。在傳輸數據前通信雙方必須建立連接&#xff08;所謂連接&#xff0c;是指客戶端和服務端各自保存一份關于對方的信息&#xff0c;比如ip地址&#xff0c;端口號等&#xff09;。TCP通過三次握手建立一個…

從零開始:C++ String類的模擬實現

文章目錄 引言1.類的基本結構2.構造函數和析構函數3.基本成員函數總結 引言 在C編程中&#xff0c;字符串操作是非常常見且重要的任務。標準庫中的std::string類提供了豐富且強大的功能&#xff0c;使得字符串處理變得相對簡單。然而&#xff0c;對于學習C的開發者來說&#x…

C語言----斐波那契數列(附源代碼)

各位看官們好&#xff0c;當我寫了上一篇博客楊輝三角后&#xff0c;有一些看官叫我講一下斐波那契數列。對于這個大家應該是有了解的。最簡單的規律就是f(n)f(n-2)f(n-1)。就是當前是前兩項之和&#xff0c;然后下標1和0都是1.從第三項開始計算的。那么我們知道規律&#xff0…

位圖(c++)

文章目錄 1.位圖概念2.位圖的實現3.應用&#xff08;解決整形存在或次數問題&#xff09;3.1存在問題3.2次數問題 5.搜索的方法對比&#xff1a; 1.位圖概念 和哈希一樣&#xff0c;都是一個表來記錄某個元素的個數或者存在與否&#xff1b;不同的是哈希使用的計算機定義的完整…

旅游卡創業的機會在哪里?

在當今社會&#xff0c;旅游已經成為了人們休閑娛樂的重要方式之一。 隨著經濟的發展和人們生活水平的提高&#xff0c;越來越多的人開始追求更高品質的旅游體驗。因此&#xff0c;旅游卡創業應運而生&#xff0c;為游客提供了更加便捷、實惠的旅游服務。那么&#xff0c;旅游…

群輝部署小雅alist實現視聽盛會

最近群輝搭建起來了&#xff0c;開始整蠱影視庫&#xff0c;之前搞過nastool。這次折騰下小雅alist。 1.下載并安裝 直接在群輝的docker里面下載映像 主要映射下端口和文件夾 #token mytoken.txt 獲取地址&#xff1a;https://alist.nn.ci/zh/guide/drivers/aliyundriv…

Git使用(2):遠程倉庫

一、創建遠程倉庫 登錄碼云Gitee - 基于 Git 的代碼托管和研發協作平臺。 點擊右上角&#xff0c;新建倉庫。 創建完成&#xff0c;復制倉庫地址接下來要使用。 二、將idea項目推送到碼云 首先創建本地倉庫VCS -> Create Git Repository。然后選擇Manage Remotes&#xff0…

服務器是網絡中的重要設備

眾所周知&#xff0c;服務器是網絡中的重要設備&#xff0c;要接受少至幾十人、多至成千上萬人的訪問&#xff0c;因此對服務器具有大數據量的快速吞吐、超強的穩定性、長時間運行等嚴格要求。但是&#xff0c;今天我們了解的是GPU服務器&#xff0c;很明顯&#xff0c;從字面上…

機器學習的目的

機器學習的目的是讓計算機能夠從數據中學習并改善性能&#xff0c;以執行特定的任務而無需明確的編程指令。具體來說&#xff0c;機器學習旨在實現以下幾個主要目標&#xff1a; 1. 預測與泛化&#xff1a; 機器學習的一個主要目標是通過學習數據的模式和特征&#xff0c;從而對…

舊衣回收,整個項目環節詳細拆解

日常舊衣服很多人果斷丟垃圾箱&#xff0c;殊不知這背后隱藏著商機。大把人都在掘金的項目。 舊衣回收&#xff0c;眼下市場覆蓋率才占10%。絕對的藍海&#xff0c;干這種項目成本很低。小到自家的舊衣回收能換小錢&#xff0c;大到開公司做分揀撈利潤。 說到這里&#xff0c…

用友hr軟件統一認證與致遠OA單點登錄身份周期管理怎么做

一、引言 隨著企業信息化建設的深入&#xff0c;各類管理軟件如用友HR、致遠OA等已經成為事業單位日常運營不可或缺的工具。用友HR軟件以其強大的人力資源管理功能&#xff0c;幫助企事業單位實現員工信息的集中管理&#xff1b;而致遠OA則以其便捷的辦公流程管理&#xff0c;…

機器學習概念:一些基本概念

目錄 數據集 (Dataset)&#xff1a;用于訓練和評估模型的數據集合。 特征 (Feature)&#xff1a;描述數據的屬性或變量&#xff0c;用于訓練模型。 標簽 (Label)&#xff1a;在監督學習中&#xff0c;與輸入數據相關聯的輸出結果。 模型 (Model)&#xff1a;對數據的某種假…

springcloud簡單了解及上手

springcloud微服務框架簡單上手 文章目錄 springcloud微服務框架簡單上手一、SpringCloud簡單介紹1.1 單體架構1.2 分布式架構1.3 微服務 二、SpringCloud與SpringBoot的版本對應關系2022.x 分支2021.x 分支2.2.x 分支 三、Nacos注冊中心3.1 認識和安裝Nacos3.2 配置Nacos3.3 n…

C++ 并發編程指南(11)原子操作 | 11.6、計算機內存結構

文章目錄 一、計算機內存結構1、內存的基本組成2、內存的類型3、內存的結構層次4、CPU架構5、局部性原理6、總結 前言 在探討計算機的運行效率和數據處理能力時&#xff0c;內存結構無疑是一個至關重要的部分。內存&#xff0c;作為計算機系統中的關鍵組件&#xff0c;承擔著存…

vue從入門到精通(一):Vue模板語法

一&#xff0c;模板語法 Vue 使用一種基于 HTML 的模板語法&#xff0c;使我們能夠聲明式地將其組件實例的數據綁定到呈現的 DOM 上。所有的Vue模板都是語法層面合法的 HTML&#xff0c;可以被符合規范的瀏覽器和 HTML 解析器解析。 Vue模板語法有2大類: 插值語法: 功能:用于解…

請介紹下H264的多參考幀技術及其應用場景,并請說明下為什么要有多參考幀?

H.264&#xff08;也稱為H.264/AVC&#xff09;的多參考幀機制是其編碼效率和質量提升的關鍵部分。這個機制允許編碼器在編碼當前幀時&#xff0c;參考多個之前已編碼的幀。這種多參考幀的方法為編碼器提供了更多的選擇&#xff0c;使其能夠更準確地預測當前幀的內容&#xff0…