第一篇:Django簡介

第一篇:Django簡介

文章目錄

  • 第一篇:Django簡介
    • 一、純手寫一個簡易版的web框架
      • 1、軟件開發架構
      • 2、HTTP協議
      • 3、簡易的socket服務端
      • 4、wsgiref模塊
      • 5、動靜態網頁
      • 6、后端獲取當前時間展示到html頁面上
      • 7、字典數據傳給html文件
      • 8、數據從數據庫中獲取的展示到html頁面上
      • 9、jinja2模塊之模塊語法
      • 10、自定義模塊總結
    • 二、Django框架介紹
      • 1、python三大主流web框架
      • 2、Django安裝
      • 3、django基本操作
      • 4、應用
      • 5、總結

一、純手寫一個簡易版的web框架

為了便于理解Django及web服務內部的原理,我們可以自己動手寫一個簡易版的web框架,便于理解思路。

Django框架為后端框架,為了連接前端與數據庫。

1、軟件開發架構

cs架構   客戶端   服務端
bs架構   瀏覽器   服務端
# 本質bs也是cs

2、HTTP協議

  • HTTP協議是應用層協議,屬于網絡協議
網絡協議
HTTP協議				數據傳輸是明文
HTTPS協議				數據傳輸是密文
websocket協議		     數據傳輸是密文
  • 四大特性
1.基于請求響應
2.基于TCP、IP作用于應用層之上的協議
3.無狀態
4./無鏈接
  • 數據格式
請求首行
請求頭
\r\n	
請求體
  • 相應狀態碼
1XX
2XX			200
3XX			
4XX			403 404
5XX			500

3、簡易的socket服務端

如何實現網址后綴名不同,而返回不同的內容?

我們先建一個簡單的服務端,代碼如下

# 你可已經web框架比作為服務端
import socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 不寫默認是TCP鏈接
server.bind(('127.0.0.1', 8080))
server.listen(5)while True:conn, addr = server.accept()data = conn.recv(1024)  # 接收到客戶端發來的數據print(data)  # 我們這里先打印以下數據conn.close()

我們使用瀏覽器進行訪問,訪問地址為127.0.0.1:8080,為本地環回測試。

我們使用三次url進行測試,第一次為 127.0.0.1:8080; 第二次為127.0.0.1:8080/index; 第三次為127.0.0.1/login;便可以在服務端得到以下數據

通過觀察數據,我們發現使用 utf-8進行解碼之后,數據是已字符串的形式進行顯示的,所以我們可以操作字符串,來拿到我們想要的鏈接的后綴,代碼如下

# 你可已經web框架比作為服務端
import socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 不寫默認是TCP鏈接
server.bind(('127.0.0.1', 8080))
server.listen(5)while True:conn, addr = server.accept()data = conn.recv(1024)  # 接收到客戶端發來的數據# print(data)  # 我們這里先打印以下數據data = data.decode('utf-8')conn.send(b'HTTP/1.1 200 OK\r\n\r\n')  # 根據http協議,此為請求頭,請求體,和\r\ncurrent_path = data.split(' ')[1]  # 我們可以操作字符串,拿到后綴# 對后綴進行簡單的判斷if current_path == '/index':conn.send('data from index'.encode('utf-8'))elif current_path == '/login':conn.send('data from login'.encode('utf-8'))else:conn.send(b'hello world')  # 只有英文和數字,可以方便轉為bytesconn.close()

于是我們可以看到,如果訪問 127.0.0.1/index,我們可以看到

如果訪問 127.0.0.1/login,我們可以看到

如果訪問 127.0.0.1,我們可以看到

同時我們可以在服務端直接發送html界面,來實現以下效果,代碼修改如下:

if current_path == '/index':# 打開html文件with open('02 html界面.html', mode='rb') as f:conn.send(f.read())

到了這里,我們雖然可以實現簡單的交互,但是我們發現,該代碼還是有很多不足之處。

1.代碼重復(服務端代碼所有人都要重復寫)
2.手動處理http格式的數據,并且只能拿到url后綴,而且其他數據獲取繁瑣(數據格式一樣處理的代碼其實也大致一樣 重復寫)
3、不能實現并發【同一服務端只能由一個客戶端進行訪問】

4、wsgiref模塊

wsgiref模塊對socket server部分做了一定的優化,減少了造輪子,同時變得更加精簡,我們利用wsgiref模塊來替換我們自己寫的web框架的socket server部分。

"""
wsgiref模塊1.請求來的時候解析http格式的數據 封裝成大字典2.響應走的時候給數據打包成符合http格式 再返回給瀏覽器
"""

我們使用 127.0.0.1/index 進行訪問,雖然在print(env)這里會報錯,但是我們會發現

from wsgiref.simple_server import make_serverdef run(env, response):  # 監聽到客戶端,make_server會給run傳遞兩個參數""":param env: 請求相關的所有數據:param response: 響應相關的所有數據:return: 返回給瀏覽器的數據"""print(env)  # passif __name__ == '__main__':server = make_server('127.0.0.1', 8080, run)"""會實時監聽127.0.0.1:8080地址 只要有客戶端來了都會交給run函數處理(加括號觸發run函數的運行)flask啟動源碼make_server('127.0.0.1',8080,obj)__call__"""server.serve_forever()  # 啟動服務端

所以,env為一個大字典,里面包含了各種各樣的信息

我們接著對wsgiref的后續代碼進行補充,可以實現和上面自己的web服務一樣的服務,同時,比自己寫的精簡不少。

后續補充代碼如下

from wsgiref.simple_server import make_serverdef run(env, response):  # 監聽到客戶端,make_server會給run傳遞兩個參數""":param env: 請求相關的所有數據:param response: 響應相關的所有數據:return: 返回給瀏覽器的數據"""print(env)  # 大字典  wsgiref模塊幫你處理好http格式的數據 封裝成了字典讓你更加方便的操作response('200 OK', [])  # 響應首行 響應頭current_path = env.get('PATH_INFO')if current_path == '/index':return [b'data from index']elif current_path == '/login':return [b'data from login']return [b'404 error']if __name__ == '__main__':server = make_server('127.0.0.1', 8080, run)"""會實時監聽127.0.0.1:8080地址 只要有客戶端來了都會交給run函數處理(加括號觸發run函數的運行)flask啟動源碼make_server('127.0.0.1',8080,obj)__call__"""server.serve_forever()  # 啟動服務端

但是,到了這里,又會出現新的問題,如果你的后綴頁面太多,難道要一直使用elif進行添加嗎?【參考函數字典】

代碼如下:

from wsgiref.simple_server import make_serverdef index(env):  # 這里傳env是為了讓函數內部更好的處理數據return 'data from index'def login(env):return 'data from login'def error(env):return 'data not found'# url與函數的對應關系
urls = [('/index', index),('/login', login)
]def run(env, response):  # 監聽到客戶端,make_server會給run傳遞兩個參數""":param env: 請求相關的所有數據:param response: 響應相關的所有數據:return: 返回給瀏覽器的數據"""print(env)  # 大字典  wsgiref模塊幫你處理好http格式的數據 封裝成了字典讓你更加方便的操作response('200 OK', [])  # 響應首行 響應頭current_path = env.get('PATH_INFO')# 定義一個變量 存儲匹配到的函數名func = Nonefor url in urls:if current_path == url[0]:# 將url對應的函數名賦值給funcfunc = url[1]break  # 匹配到一個之后 應該立刻結束for循環,減少無用匹配# 判斷func是否有值if func:res = func(env)else:res = error(env)# 統一將返回的函數返回的轉碼成二進制,并返回給瀏覽器return [res.encode('utf-8')]if __name__ == '__main__':server = make_server('127.0.0.1', 8080, run)"""會實時監聽127.0.0.1:8080地址 只要有客戶端來了都會交給run函數處理(加括號觸發run函數的運行)flask啟動源碼make_server('127.0.0.1',8080,obj)__call__"""server.serve_forever()  # 啟動服務端

好了,已經到了這里,你以為結束了嗎?還遠遠沒有,我們發現代碼全部寫在了一個文件中,看起來很冗余,不方便進行拓展。【參考軟件開發目錄規范】

我們將代碼分文件進行存儲。分為三個py文件和一個文件夾(用來存放html文件)。

  • start.py
from wsgiref.simple_server import make_server
from urls import urls
from views import *def run(env, response):  # 監聽到客戶端,make_server會給run傳遞兩個參數""":param env: 請求相關的所有數據:param response: 響應相關的所有數據:return: 返回給瀏覽器的數據"""print(env)  # 大字典  wsgiref模塊幫你處理好http格式的數據 封裝成了字典讓你更加方便的操作response('200 OK', [])  # 響應首行 響應頭current_path = env.get('PATH_INFO')# 定義一個變量 存儲匹配到的函數名func = Nonefor url in urls:if current_path == url[0]:# 將url對應的函數名賦值給funcfunc = url[1]break  # 匹配到一個之后 應該立刻結束for循環,減少無用匹配# 判斷func是否有值if func:res = func(env)else:res = error(env)# 統一將返回的函數返回的轉碼成二進制,并返回給瀏覽器return [res.encode('utf-8')]if __name__ == '__main__':server = make_server('127.0.0.1', 8080, run)"""會實時監聽127.0.0.1:8080地址 只要有客戶端來了都會交給run函數處理(加括號觸發run函數的運行)flask啟動源碼make_server('127.0.0.1',8080,obj)__call__"""server.serve_forever()  # 啟動服務端
  • urls.py

    存放路由與視圖函數對應關系

from views import *# url與函數的對應關系
urls = [('/index', index),('/login', login)
]
  • views.py

    用來存放視圖函數(后端業務邏輯),也就是放訪問到特定的后綴時訪問該函數。

def index(env):  # 這里傳env是為了讓函數內部更好的處理數據return 'data from index'def login(env):return 'data from login'def error(env):return 'data not found'
  • temlates文件夾

    用來存放html頁面文件

總結:

如此一來,按照功能的不同拆分之后,后續添加功能只需要在urls.py書寫對應關系然后去views.py書寫業務邏輯即可。

5、動靜態網頁

  • 靜態網頁

    簡單來說,就是頁面上的數據是直接寫死的,不會改變。

  • 動態網頁

    網頁上的數據是實時獲取的。

    eg:1.后端獲取當前時間展示到html頁面上2.數據是從數據庫中獲取的數據展示到html頁面上

6、后端獲取當前時間展示到html頁面上

此時,我們直接從 views.py 和 urls.py 文件中添加即可。效果如下。

代碼如下:

"""urls.py中"""
urls = [('/index', index),('/login', login),('/get_time', get_time)
]"""views.py"""
def get_time(env):import datetimecurrent_time = datetime.datetime.now().strftime('%Y-%m-%d %X')# 如何將后端獲取到的數據"傳遞"給html文件?with open('templates/01 myhtml.html', mode='rt', encoding='utf-8') as f:# 在后端將html頁面處理好之后再返回給前端data = f.read().replace('message', current_time)return data  # data就是一堆字符串"""01 myhtml.html"""
<div><h1>這是從后端傳來的數據</h1><h1>message</h1>
</div>

7、字典數據傳給html文件

將一個字典傳遞給html文件 并且可以在文件上方便快捷的操作字典數據,訪問效果如下

這里我們需要導入一個jinja2模塊,來進行操作,代碼如下

"""templates/02 get_dict.html"""
<h1>我是一個頁面</h1>
{{ user }}  
{{ user.get('username')}}  # 類似python取字典
{{ user.age }}  # 類似js取字典
{{ user['hobby'] }}  # 類似python取字典"""urls.py"""
urls = [('/index', index),('/login', login),('/get_time', get_time),('/get_dict', get_dict)  # 添加路由對象關系
]"""views.py"""
def get_dict(env):from jinja2 import Template# 創建一個字典user_dic = {'username': 'yangyi','age': 18,'hobby': 'study'}with open('templates/02 get_dict.html', mode='rt', encoding='utf-8') as f:data = f.read()tmp = Template(data)  # 給get_dict.html傳遞了一個值 頁面上通過變量名user就能夠拿到user_dictres = tmp.render(user=user_dic)# 返回給瀏覽器數據return res

8、數據從數據庫中獲取的展示到html頁面上

我們先使用navicat快速創建一個數據庫,數據庫效果如下。

瀏覽器展示效果如下:

具體代碼如下:

"""get_data.html"""
<div class="container">  # 使用bootstrap進行渲染<div class="row"><div class="col-md-8 col-md-offset-2"><h1 class="text-center">用戶數據</h1><table class="table table-hover table-striped"><thead><tr><th>ID</th><th>username</th><th>password</th><th>hobby</th></tr></thead><tbody>
<!--                    [{},{},{},{},{}]-->  # jinja2模塊可以實現數據for循環{% for user_dict in user_list %}<tr><td>{{ user_dict.id}}</td><td>{{ user_dict.username}}</td><td>{{ user_dict.password}}</td><td>{{ user_dict.hobby}}</td></tr>{% endfor%}</tbody></table></div></div>
</div>"""usls.py"""
urls = [('/index', index),('/login', login),('/get_time', get_time),('/get_dict', get_dict),('/get_data', get_data)
]"""views.py"""
def get_data(env):# 導入pymysql模塊,用來操作數據庫import pymysql# 去數據庫中獲取數據 傳遞給html頁面 借助于模版語法 發送給瀏覽器from jinja2 import Templateconn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123',db='day59',charset='utf8',autocommit=True)cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 寫sql語句sql = 'select * from user_info'# 受影響的行數affect_rows = cursor.execute(sql)data_list = cursor.fetchall()  # [{},{},{}]# 將獲取到的數據傳遞給html文件with open('templates/03 get_data.html', mode='rt', encoding='utf-8') as f:data = f.read()tmp = Template(data)res = tmp.render(user_list=data_list)return res

9、jinja2模塊之模塊語法

pip3 install jinja2
"""模版語法是在后端起作用的"""# 模版語法(非常貼近python語法)
{{ user }}
{{ user.get('username')}}
{{ user.age }}
{{ user['hobby'] }}# 實現for循環
{% for user_dict in user_list %}
<tr><td>{{ user_dict.id}}</td><td>{{ user_dict.username}}</td><td>{{ user_dict.password}}</td><td>{{ user_dict.hobby}}</td>
</tr>
{% endfor%}

10、自定義模塊總結

簡易版本web框架流程圖如下

二、Django框架介紹

1、python三大主流web框架

  • Django

    特點:大而全 自帶的功能特別特別特別的多 類似于航空母艦
    不足之處:有時候過于笨重
    
  • flask

    特點:小而精  自帶的功能特別特別特別的少 類似于游騎兵第三方的模塊特別特別特別的多,如果將flask第三方的模塊加起來完全可以蓋過django并且也越來越像django
    不足之處:比較依賴于第三方的開發者
    
  • tornado

    特點:異步非阻塞 支持高并發
    
  • 總結:

    """web模塊分為三部分"""A:socket部分B:路由與視圖函數對應關系(路由匹配)C:模版語法"""django"""A用的是別人的		wsgiref模塊B用的是自己的C用的是自己的(沒有jinja2好用 但是也很方便)"""flask"""A用的是別人的		werkzeug(內部還是wsgiref模塊)B自己寫的C用的別人的(jinja2)"""tornado"""A,B,C都是自己寫的
    

2、Django安裝

  • 正常啟動要求
# 如何讓你的計算機能夠正常的啟動django項目
1.計算機的名稱不能有中文
2.一個pycharm窗口只開一個項目
3.項目里面所有的文件也盡量不要出現中文
4.python解釋器盡量使用3.4~3.6之間的版本(如果你的項目報錯,你點擊最后一個報錯信息,去源碼中把逗號刪掉)
  • 版本
# django版本問題1.X 2.X 3.X(直接忽略)    這里使用django 1.11.11版本
  • 安裝
# django安裝pip3 install django==1.11.11# 或者使用pycharm進行安裝

3、django基本操作

  • 命令行執行
# 1.創建django項目
"""先切換到要創建的文件路徑,然后進行創建"""django-admin startproject mysite  # 創建一個名為mysite的django項目mysite文件夾manage.pymysite文件夾__init__.pysettings.pyurls.pywsgi.py

# 2.啟動django項目
"""一定要先切換到項目目錄下	cd /mysite
"""
python3 manage.py runserver  # 啟動django服務器
# http://127.0.0.1:8000/  

# 3.創建應用
"""
Next, start your first app by running python manage.py startapp [app_label].
"""python3 manage.py startapp app01
應用名應該做到見名知意
  • pycharm操作
# 1 new project 選擇左側第二個django即可# 2 啟動1.還是用命令行啟動2.點擊綠色小箭頭即可# 3 創建應用1.pycharm提供的終端直接輸入完整命令2.pycharm tools run manage.py task提示# 4 修改端口號以及創建server【可選】edit confi....

剛創建的django項目都出錯【我裂開了】,仔細觀察,我們發現是路徑拼接方式不對,稍作修改即可。

創建app01,文件夾中文件如下。

4、應用

django是一款專門用來開發app的web框架。一個app就是一個獨立的功能模塊.

"""
django框架就類似于是一所大學(空殼子)
app就類似于大學里面各個學院(具體功能的app)比如開發淘寶訂單相關用戶相關投訴相關創建不同的app對應不同的功能選課系統學生功能老師功能
"""

重點:創建的應用一定要去配置文件中注冊

將settings.py中的參數進行修改,方式如下

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app01.apps.App01Config',  # 全寫'app01',			 # 簡寫
]# ps:你在用pycharm創建項目的時候 pycharm可以幫你創建一個app并且自動注冊

主要文件介紹

-mysite項目文件夾--mysite文件夾---settings.py		配置文件---urls.py			路由與視圖函數對應關系(路由層)---wsgi.py			wsgiref模塊(不考慮)--manage.py				django的入口文件--db.sqlite3			django自帶的sqlite3數據庫(小型數據庫 功能不是很多還有bug)--app01文件夾---admin.py			django后臺管理---apps.py			注冊使用---migrations文件夾		數據庫遷移記錄---models.py		數據庫相關的 模型類(orm)---tests.py			測試文件---views.py			視圖函數(視圖層)

命令行與pycharm的區別

命令行創建不會自動有templates文件夾 需要你自己手動創建而pycharm會自動幫你創建并且還會自動在配置文件中配置對應的路徑。

# pycharm創建
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')]
]# 命令行創建
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [],
]"""
也就意味著你在用命令創建django項目的時候不單單需要創建templates文件夾還需要去配置文件中配置路徑
'DIRS': [os.path.join(BASE_DIR, 'templates')]
"""

django小白必會三板斧

  • HttpResponse

    返回字符串類型的數據

    from django.shortcuts import render, HttpResponse, redirect# Create your views here.def index(request):return HttpResponse('曾經滄海難為水,除卻巫山不是云。')
    

  • render

    返回html文件的

    def get_html(request):# 自動去tempaltes文件夾下幫你查找文件return render(request, 'myhtml.html')  
    


如何實現向html文件中如何傳參?

第一種:

# 第一種  
"""show_arg.html"""
<div>{{ data }}</div>
<div>{{ date }}</div>"""views.py"""
def show_arg(request):user_dict = {'name': 'yangyi','age': 18,'gender': 'male'}# 第一種傳值方式:更加的精確 節省資源(需要將數據賦值給一個接受的變量中,如 data date)return render(request, 'show_arg.html', {'data': user_dict, 'date': 123})

效果如下所示

第二種:

# 第二種
"""show_arg.html"""
<div>{{ user_dict }}</div>"""views.py"""
def show_arg(request):user_dict = {'name': 'yangyi','age': 18,'gender': 'male'}# 第二種傳值方式:當你要傳的數據特別多的時候"""locals會將所在的名稱空間中所有的名字全部傳遞給html頁面"""return render(request, 'show_arg.html', locals())

  • redirect

    重定向

    # 1、重定向去其它地址
    def new_addr(request):return redirect('https://www.youku.com')# 2、重定向去自定義地址
    def new_addr(request):return redirect('/home/')def home(request):  # 被重定向的函數也得注冊return HttpResponse('from home')
    

5、總結

"""我們在使用django框架的時候的步驟"""
1、使用pycharm創建一個django項目
2、將配置文件中templates的注冊路徑進行修改
3、創建應用
4、注冊應用
5、書寫views.py文件
6、配置urls.py文件【注意:要導入views模塊】  # from app01 import views

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

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

相關文章

【筆記】CentOS7部署K8S集群

一、初始化&#xff08;所有節點機器都要執行&#xff09; 1. 關閉firewall防火墻 systemctl disable firewalld.service systemctl stop firewalld.service2. 關閉SELinux 臨時關閉 setenforce 0永久關閉 vim /etc/selinux/config SELINUXenforcing 改成 SELINUXdisable…

Ethan獨立開發產品日報 | 2025-04-22

1. Agent Simulate 用數千個數字人來測試你的人工智能應用。 Agent Simulate 讓你在發布之前&#xff0c;能夠在一個安全的環境中模擬和測試大型語言模型&#xff08;LLM&#xff09;代理。它幫助你調試行為、加快迭代速度&#xff0c;并降低生產風險&#xff0c;專為代理開發…

Photoshop安裝與配置--簡單攻略版

下載地址:Photoshop軟件工具下載 安裝完成后&#xff0c;即可運行Photoshop.exe&#xff1b;打開工具頁面后&#xff0c;按照下面簡單配置即可 1.編輯-》首選項-》常規 或者直接快捷鍵CtrlK 暫存盤&#xff1a;一定要設置為非C盤 2.性能 3.文件處理 以上配置比較基礎&#xf…

新手村:正則化

機器學習-正則化方法 新手村&#xff1a;正則化 什么是正則化&#xff1f; 正則化&#xff08;Regularization&#xff09; 是一種用于防止機器學習模型 過擬合&#xff08;Overfitting&#xff09;的技術。它通過在模型的 損失函數 中添加一個 懲罰項&#xff08;Penalty Ter…

C語言 ——— 分支循環語句

目錄 分支循環語句 單分支 多分支 switch 分支語句 牛刀小試 判斷一個數是否是奇數 輸出 1-100之間 的奇數 計算 n 的階乘 計算 1! 2! 3! ... n! 在一個有序數組中查找具體的某一個數字 打印 100-200 之間的素數 求兩個整數的最大公約數 getchar函數 和 putc…

Element UI、Element Plus 里的表單驗證的required必填的屬性不能動態響應?

一 問題背景 想要實現&#xff1a; 新增/修改對話框中(同一個)&#xff0c;修改時“備注”字段非必填&#xff0c;新增時"備注"字段必填 結果發現直接寫不生效-初始化一次性 edit: [{ required: true, message: "請輸入備注", trigger: "blur" }…

秀丸編輯器 使用技巧

參考資料 第II部?知っていると便利な秀丸の機能 検索テキストファイルの16進表示について秀丸エディタヘルプ目次秀丸エディタ&#xff31;&#xff06;&#xff21;集(第9.6版)&#xff08;HTML 形式&#xff09;テンプレート&#xff08;Ver9.43対応版&#xff09; 目錄 零…

【期末復習-考試】軟件質量測試與保考試題庫(選擇題+填空題)

軟件質量測試與保證考試題庫&#xff08;選擇題 填空題&#xff09; 一、軟件測試基礎理論&#xff08;200 題&#xff09; &#xff08;一&#xff09;選擇題&#xff08;100 題&#xff09; 軟件測試的根本目的是&#xff08; 發現軟件中的缺陷&#xff09;A. 證明軟件無…

數據結構與算法學習筆記(Acwing提高課)----動態規劃·數字三角形

數據結構與算法學習筆記----動態規劃數字三角形 author: 明月清了個風 first publish time: 2025.4.23 ps??終于開始提高課的題啦&#xff0c;借的人家的號看&#xff0c;以后給y總補票叭&#xff0c;提高課的題比之前的多很多啊哈哈哈哈&#xff0c;基本上每種題型都對應了…

阿里巴巴安全工程師面試題:BAS

阿里巴巴新發布了針對應屆生的安全工程師招聘崗位&#xff0c;崗位要求&#xff1a; 研究新型前沿攻防技術&#xff0c;驗證正向和防御安全產品能力的有效性&#xff0c;挖掘其規則或引擎漏洞&#xff0c;并利用BAS&#xff08;Breach and Attack Simulation&#xff09;建立自…

【正則表達式】正則表達式使用總結

正則表達式除了匹配普通字符外,還可以匹配特殊字符,這些特殊字符被稱為“元字符”。? 特殊字符(元字符) ?限定符?:用于指定正則表達式中某個組件的出現次數。常見的限定符包括: *:0次或多次 +:1次或多次 ?:0次或1次 {n}:恰好n次…

數據庫對象與權限管理-Oracle數據字典詳解

1. 數據字典概念講解 Oracle數據字典是數據庫的核心組件&#xff0c;它存儲了關于數據庫結構、用戶信息、權限設置和系統性能等重要的元數據信息。這些信息對于數據庫的日常管理和維護至關重要。數據字典在數據庫創建時自動生成&#xff0c;并隨著數據庫的運行不斷更新。 數據…

鏈表系列一>兩數相加

目錄 題目&#xff1a;解析&#xff1a;方法&#xff1a;代碼&#xff1a;鏈表常用技巧&#xff1a; 題目&#xff1a; 鏈接: link 解析&#xff1a; 方法&#xff1a; 代碼&#xff1a; /*** Definition for singly-linked list.* public class ListNode {* int val;* …

FreeRTOS深度解析:隊列集(Queue Sets)的原理與應用

FreeRTOS深度解析&#xff1a;隊列集&#xff08;Queue Sets&#xff09;的原理與應用 什么是隊列集&#xff1f; 在FreeRTOS中&#xff0c;隊列集&#xff08;Queue Sets&#xff0c;英文名xQueueSet&#xff09;是一種強大的數據結構&#xff0c;用于高效管理多個隊列。它的…

QT creater和vs2017文件路徑問題

1. \\雙反斜杠&#xff0c;傳統寫法&#xff0c;需轉義 在 C/C 字符串中&#xff0c;\ 具有特殊含義&#xff0c;例如&#xff1a; \n 表示換行 \t 表示制表符 \" 表示雙引號 如果要表示一個真正的反斜杠&#xff0c;必須寫成 \\&#xff0c;否則編譯器會將其解釋為轉…

對流對象的理解

在c里&#xff0c;“流”可以理解為數據傳輸與操作的“介質”。 從輸入輸出角度來看&#xff0c;有輸入流&#xff08;比如cin&#xff09;和輸出流&#xff08;cout&#xff09;。對于輸入流&#xff0c;數據通過它從外部設備&#xff08;例如鍵盤&#xff09;“流入”程序內…

Visium HD多樣本拼片拆分

Visium HD實驗的時候一個捕獲區域內可以包含多個樣本拼片&#xff08;例如多個組織切片或不同樣本的排列&#xff09;是常見的實驗設計&#xff0c;多樣本拼片能夠提升實驗效率&#xff0c;單張玻片處理多個樣本&#xff0c;降低試劑和測序成本&#xff0c;后續分析的時候只需要…

進程(Process)詳解

進程&#xff08;Process&#xff09;詳解 一、基本定義 ?概念? 進程是計算機中程序的一次動態執行實例&#xff0c;包含程序代碼、數據及運行狀態&#xff0c;是操作系統進行資源分配和調度的基本單位?。與靜態的“程序”不同&#xff0c;進程是動態實體&#xff0c;隨程…

畢業論文超清pdf帶標簽導出

Word直接導出的pdf不夠清晰&#xff0c;使用打印導出的pdf又不帶書簽以及目錄跳轉功能這一問題&#xff0c;查閱網上資料使用Adobe DC似乎能夠解決但是下載安裝比較麻煩&#xff0c;于是寫了python程序解決該問題。 解決思路&#xff1a; 使用python腳本對兩個pdf文件進行合并…

NOIP2012提高組.同余方程

目錄 題目算法標簽: 數論, 擴展歐幾里得算法思路代碼 題目 203. 同余方程 算法標簽: 數論, 擴展歐幾里得算法 思路 簡單的擴展歐幾里得算法應用題, 擴展歐幾里得算法可以直接計算同余方程的通解, 因為求得是最小正整數解, 因此需要取模轉換為正整數 a x b y ≡ 1 ax by …