Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
import pypyodbc
sql_path=r"mybt.accdb"
conn=pypyodbc.connect(u'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=' + sql_path)
cursor=conn.cursor()
table_name="表名"
sql=f"INSERT INTO 表名 (1,2) VALUES ('demo1','demo2');"
cursor.execute(sql)
conn.commit()
cursor.close()
conn.close()
#Access數據庫并不適合大型數據使用,一般用來存儲一些小批量信息,如爬取某些電影的磁力
#鏈接進行保存。分別存儲電影名稱,演員,鏈接,時長等信息。以及記錄鏈接分享日期。
.使用該代碼需要先安裝pypyodbc庫。在dos窗口輸入以下指令
pip install pypyodbc
2.在微軟官網下載相應驅動分為32和64位版本。
下載地址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=54920
3.相關參數詳細說明:
3-1. mybt.accdb為數據庫文件所在地址,后綴為accdb。
sql_path=r"mybt.accdb"
這是文件截圖
3.2. 表名對于下圖中的表1。
table_name="表名"
3.2詳圖
3.3 INSERT代表插入內容,表面對應上面所說的表名,第一個小括號內1,2,分別指上圖中的表格里的1,2(你自己命名的,它對應了相應的數據類型)。demo1,demo2表示改指令把demo1,demo2分別對應1,2的位置插入。執行結果見下圖。
易錯:當使用列表元素填充時,外面一定要加“''”,否則執行會報錯(不會顯示報錯,因為不加引號符合Python語法)。
sql=f"INSERT INTO 表名 (1,2) VALUES ('demo1','demo2');"
sql=f"INSERT INTO 表名 (1,2) VALUES ('{a[0]}','{a[1]}');"
這是執行完指令后的結果
ython開發web服務的優勢是開發效率高,可能只需要java五分之一的代碼量。
Python搭建web服務有許多框架,本文介紹Django和bottle兩個框架。
首先,安裝該框架
安裝成功,版本是1.11.28. 框架的文件安裝在\python27\Scripts目錄下(搜索電腦中Python安裝目錄下的Scripts就對了)。
先進入\python27\Scripts目錄,建立項目jinanwx(名稱隨便起)
同一個目錄下可以看到新建立工程的目錄
進入python27\Scripts\jinanwx\jinanwx。新建我們自己的模塊
jgotest01.py里面寫簡單的代碼如下
模塊功能就是返回個json格式結果。
然后需要改urls.py模塊
目錄文件如下
就這么簡單,新建一個文件再修改一個文件,就成了。
回到上一級目錄啟動服務
啟動成功,瀏覽器訪問試試
開發功能不是特別復雜的web服務,可以考慮使用bottle框架,它比Django輕量。bottle例子在Linux下演示。
使用bottle框架首先安裝。一個指令搞定。
# pip install bottle
進入Python命令行import bottle,沒報錯就是成功了。
我的web服務就一個文件bottleweb.py,代碼如下,一些解釋在代碼的注釋里
#coding=utf-8
from bottle import (run, route, get, post, put, delete, request, hook, response, static_file, app)
import json
import MySQLdb #本例子需要操作數據庫,否則可以不寫這行,這個數據庫包pip估計安裝不會成功,我是用yum install MySQL-python成功的
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import bottle
app = bottle.default_app()#處理靜態資源需要定義,沒有靜態資源可以不寫這行
#搭建vue腳手架前后臺聯調時要下面兩個@hook內容,否則會報跨域訪問資源的錯誤
@hook('before_request')
def validate():
REQUEST_METHOD = request.environ.get('REQUEST_METHOD')
HTTP_ACCESS_CONTROL_REQUEST_METHOD = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_METHOD')
if REQUEST_METHOD == 'OPTIONS' and HTTP_ACCESS_CONTROL_REQUEST_METHOD:
request.environ['REQUEST_METHOD'] = HTTP_ACCESS_CONTROL_REQUEST_METHOD
@hook('after_request')
def enable_cors():
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Methods'] = 'GET,POST,PUT,DELETE,OPTIONS'
response.headers['Access-Control-Allow-Headers'] = '*'
@route('/test2020/dist/<path>')#靜態資源在web服務下的地址,沒放前端的靜態資源這幾個route和app.route可以不寫
def stat(path):
return static_file(path, root='./dist/')
@app.route('/test2020/dist/static/js/<path>')
def js(path): #這幾個目錄我寫成這樣是因為vue打包完后目錄結構就是dist 里面static等等
return static_file(path, root='./dist/static/js/')
@app.route('/test2020/dist/static/css/<path>')
def css(path):
return static_file(path, root='./dist/static/css/')
@get('/test2020/date')#返回某個表中的日期,看sql你就明白了
def helloins():
db = MySQLdb.connect("127.0.0.1", "yourusername", "yourpassword", "yourDBname", charset='utf8' )
cursor = db.cursor()
sql = "select DISTINCT date from testtable"
print sql
cursor.execute(sql)
data = cursor.fetchall()
jsondata={}
results=[]
for row in data:
result = {}
result['DATE'] = row[0]
results.append(result)
jsondata['code']=0
jsondata['datas']=results
return jsondata #返回json格式為了方便前端vue接收處理,其實返回各種類型都可以
@get('/test2020/helloworld')
def helloworld():
return 'hello world!'
if __name__ == '__main__':
run(host='0.0.0.0', port=2020, debug=True, reloader=True)
bottleweb.py所在目錄執行
#python bottleweb.py
web服務就啟動了。瀏覽器訪問http://127.0.0.1:2020/test2020/helloworld看效果。
如果安裝了MySQL數據庫可以測試test2020/date的url是否能返回結果
數據庫只要有下面的數據就可以
前端頁面是這個樣子的,給用戶選擇某個日期。
前端是用vue+vux來開發的,開發完打包打出的東西上傳到代碼中提到的dist靜態資源目錄下。
如果覺得上面的代碼有點復雜,可以把所有route, app.route的東西刪除,把/test2020/date語句塊也刪除,把@hook刪除,MySQL的東西刪除,前端的東西也完全不考慮,就是最簡單的bottle web服務,相當于hello world。
建議盡量懂上面的代碼,涉及了靜態資源,數據庫,是web服務必須的內容。
分享一個遇到的pip的問題,我Python版本很低2.6.6。本來通過安裝yum的epel,已經成功安裝了好用的pip。但是每次我用pip命令,最下方都會提示升級
You are using pip version 9.0.3, however version 20.0.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command
我執行了pip install --upgrade pip升級,然后pip指令就不能用了。而且升級了之后,在想安裝回低版本的pip就沒有對應的安裝包了。yum只能找到20.0.2版本的(老版本會被覆蓋難道?)。
http://bootstrap.pypa.io/2.6/get-pip.py
下載了get-pip.py也無法安裝成功。最后在上面的地址下載到了2.6版本的安裝文件,才成功安裝可以使用的pip。
相比java,python開發web代碼量少,需要安裝的庫少,如果能滿足功能和性能要求,python可能是更好的選擇。
這篇教程中,我們會用 Python 的 PyQt 框架編寫一個簡單的 web 瀏覽器。關于 PyQt ,你可能已經有所耳聞了,它是 Qt 框架下的一系列 Python 組件,而 Qt(發音類似“cute”)是用來開發 GUI 的 C++ 框架。嚴格來講, Qt 也可用于開發不帶圖形界面的程序,但是開發用戶界面應該是 Qt 框架最為廣泛的應用了。Qt 的主要優勢是可以開發跨平臺的圖形界面程序,基于 Qt 的應用能夠借助于各平臺的原生性在不同類的設備上運行,而無須修改任何代碼庫。
想要學習Python。關注小編頭條號,私信【學習資料】,即可免費領取一整套系統的板Python學習教程!
Qt 附帶了 webkit 的接口,你可以直接使用 PyQt 來開發一個基于 webkit 的瀏覽器。
我們本次教程所開發的瀏覽器可以完成如下功能:
加載用戶輸入的url
顯示在渲染頁面過程中發起的所有請求
允許用戶在頁面中執行自定義的 JavaScript 腳本
牛刀小試
讓我們從最簡單的 PyQt 的 Webkit 用例開始吧:輸入 url,打開窗口并在窗口中加載頁面。
這個例子十分短小,連 import 語句和空行在內也只有 13 行代碼。
當你通過命令行將 url 傳給腳本時,程序會加載 url 并且在窗口中顯示加載完成的頁面。
現在,看似你已經有一個“命令行瀏覽器”啦!至少比 python 的 requests 模塊強多了,甚至比 Lynx 還略高一籌,因為我們的瀏覽器還可以加載 JavaScript 腳本呢。但是目前為止還沒有跟 Lynx 拉開差距,因為在啟用瀏覽器的時候只能通過命令行傳入 url。那么,必然需要通過某種方式把需要加載的 url 傳入瀏覽器。沒錯,就是地址欄!
添加地址欄
其實地址欄的實現非常簡單,我們只需要在窗口頂端加一個輸入框就夠了。用戶在文本框中輸入 url 之后,瀏覽器就會加載這個地址。下面,我們將用到 QLineEdit 控件來實現輸入框。鑒于我們的瀏覽器現在有地址欄和瀏覽器顯示框兩部分,因此還要給我們的應用增加一個網格布局。
到這里,我們已經有一個瀏覽器的雛形啦!看上去和當年的 Google Chrome 還有幾分相像呢,畢竟兩者采用了相同的渲染引擎?,F在,你可以在輸入框中輸入 url ,程序便會將地址傳入瀏覽器,接著渲染出所有的 HTML 頁面和 JavaScript 腳本并展示出來。
添加開發工具
一個瀏覽器最有趣也最重要的部分是什么?當然是各種各樣的開發工具了!一個沒有開發者控制臺的瀏覽器怎么能算是瀏覽器呢?所以,我們的 Python 瀏覽器當然也要有一些開發者工具才行。
現在,我們就來添加一些類似于 Chrome 的開發者工具中 “Network” 標簽的功能吧!這個功能就是簡單地追蹤瀏覽器引擎在加載頁面的時候所執行的所有請求。在瀏覽器主頁面的下方,我們將通過一個表來顯示這些請求。簡單起見,我們只會記錄登錄的 url、返回的狀態碼和響應的內容類型。
首先我們要通過 QTableWidget 組件創建一個表格,表頭包括需要存儲的字段名稱,表格可以根據每次新插入的記錄來自動調整大小。
想要追蹤所有請求的話,我們還需要對 PyQt 的內部構件有更深入的了解。了解到,Qt 提供了一個 NetworkAccessManager類作為 API 接口,通過調用它可以監控應用加載頁面時所執行的請求。我們需要自己編寫一個繼承自 NetworkAccessManager 的子類,添加必要的事件監聽器,然后使用我們自己編寫的 manager 來通知 webkit 視圖執行相應的請求。
首先我們需要以 NetworkAccessManager 為基類創建我們自己的網絡訪問管理器。
在這里需要提醒大家的是, Qt 的某些實現并不像想象中那么簡單明了,比如說從響應中獲取狀態碼就十分繁瑣。首先,你得把請求對象的類屬性作為參數傳入 response 的方法 .attribute() 中,.attribute() 方法的返回值是 QVariant 類型而非 int 類型。接著,需要調用內置函數 .toInt() 將其轉換成一個包含兩個元素的元組,最終得到響應的狀態碼。
現在,我們終于有了一個記錄請求的表和一個監控網絡的 manager,接下來只要把他們聚攏起來就可以了。
現在,運行瀏覽器程序,在地址欄鍵入 url,就可以看到在主頁面下方的記錄表中記錄下的所有請求。
如果你有興趣的話,還可以為瀏覽器添加很多新的功能:
通過content-type添加篩選功能
添加記錄表的排序功能
添加計時器
高亮顯示出錯的請求(比如說把錯誤信息置為紅色)
顯示出更為具體的請求內容,比如說完整的頭信息、響應內容、請求方法等。
增加一個重復發送請求并加載出來的選項。比如說用戶可以點擊在記錄表中的請求來重試請求。
其實還有太多的功能可以繼續完善和改進,你可以一一嘗試一下,這會是一個非常有趣而且收獲良多的學習過程。但是如果想把這些功能都說完,估計都能寫一本書了。所以限于篇幅,本文就不一一介紹了,感興趣的朋友可以參考其他書籍和網上教程。
增加解析自定義 JavaScript 腳本的功能
我們終于迎來最后一個功能了!就是解析在頁面中包含的 JavaScript 腳本。
基于我們之前已經打下的基礎,要完成這個功能非常簡單。我們只需要在添加一個 QLineEdit 組件,把它和頁面聯系起來,然后調用 evaulateJavaScript 方法就可以了。
下面是這個功能的示例。看,我們的開發者工具已經整裝待發了!
現在唯一缺少的就是在頁面中不能執行 Python 腳本。你可以開發自己的瀏覽器,提供對 JavaScript 和 Python 的支持,這樣其他開發者就可以針對你的瀏覽器開發應用了。
后退、前進和其他頁面操作
我們在前面已經使用了 QWebPage 對象來開發瀏覽器,當然作為一個合格的瀏覽器,我們也需要為終端用戶提供一些重要功能。Qt 的網頁對象支持很多不同操作,我們可以把它們全都添加到瀏覽器中。
現在我們可以先嘗試著添加“后退”、“前進”和“刷新”這幾個操作。你可以在界面上添加這些操作按鈕,簡單起見,這里只加一個文本框來執行這些動作。
和之前一樣,我們要創建一個 ActionInputBox 的實例,把參數傳入頁面對象并把輸入框對象添加到頁面中。
Graphical User Interface,圖形用戶界面,又稱圖形用戶接口,是指采用圖形方式顯示的計算機操作用戶界面。
WebKit是一個開源的瀏覽器引擎,與之相對應的引擎有 Gecko(Mozilla Firefox 等使用)和 Trident(也稱 MSHTML ,IE 使用)。
是不是很簡單!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。