python個人經驗總結1
文章目錄
前言
此文章僅記錄工作中使用python的一些經驗
一、python打包exe檔案
pip使用國內源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller
多模組打包
-p 後面跟的是你專案的獨立執行環境路徑 請使用絕對路徑
-F是有命令列顯示視窗的
–hidden-import 後面跟的是專案中的同目錄下的模組
pyinstaller -F -p E:\py專案獨立環境\.envs\爬蟲2.0\Lib\site-packages weibo_reply_redis_get.py --hidden-import wbrequests.py --hidden-import redisDB.py --hidden-import analysis_reply.py --hidden-import weibo_api_req.py --hidden-import weibo_model.py
二、pycharm獨立環境
1、pycharm獨立環境問題
在使用pycharm的虛擬環境時將虛擬環境路徑中設定了中文名(並不一定是這個原因)使用pip命令安裝包是直接安裝在python安裝的路徑中\Lib\site-packages中的大環境中的,並沒有在pycharm的獨立環境中解決方案有3個:
-
pip指定路徑安裝包
pip install --target=E:\py專案獨立環境.envs\spider\Lib\site-packages -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn 包名
“E:\py專案獨立環境.envs\spider\Lib\site-packages”是路徑 使用時請改成你自己的路徑 -
進入pycharm的獨立環境路徑下
找到pycharm建立的獨立環境路徑下:我的是E:\py專案獨立環境.envs\flask初體驗
“flask初體驗”是同名的專案但是其他專案也可以用這個虛擬環境
進入該目錄Scripts然後命令列來到該目錄執行activate命令,進入該虛擬環境
這時候你執行pip install 包名 就可以安裝在該虛擬環境下了(虛擬環境方便包管理)
如果你使用的是
執行的時候請加上.\activate
-
在window上安裝虛擬環境管理包
看這個人的吧出現的問題都提到了
三、python使用時常用的方法:
字串:
替換:replace(“要替換的文字”,“替換的文字”)
根據特定字元分割字串:split(‘分割符號’)
擷取字串後幾位:str[-4:]代表擷取str字串後4位
時間:時間戳擷取前13位
rnd=str(time.time()*1000)
_rnd=rnd.split(’.’)[0]
字典轉json互相轉換
jsondic=json.loads(fileread.read())#json轉字典
json.dumps(字典型別)#字典轉json字元
正則有點萬精油的規則但是有出錯的風險:
img_comtent=re.findall(r’<divaction-data=“cur_visible=0”(.*?)">’,html)
四、django的使用不包含前端只做後臺
django-admin startproject 專案名稱 建立django專案
django版本3.0
來到專案目錄中建立自己的應用
python manage.py startapp 應用名
啟動服務
python manage.py runserver
在set檔案中更改時間
language_code=‘zh-hans’
time_zone=‘asia/shanghai’
資料遷移
python manage.py migrate
在urls檔案中匯入應用view
from 應用名 import views
from helloworld.views import hello
path(‘hello/’,hello),
資料庫模型遷移
python manage.py makemigrations建立遷移檔案然後使用上面的資料遷移命令才會將模型檔案建立到資料庫中
模型的建立
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
資料更新
student=Student.objects.get(id=2)
student.name=‘更改的名字’
student.save()儲存
資料刪除
student=Student.object.get(id=3)
student.delete()
偽裝資料庫
import pymysql
pymysql.install_as_MySQLdb()
資料庫更改為mysql
DATABASES = {
‘default’: {
# ‘ENGINE’: ‘django.db.backends.sqlite3’,
# ‘NAME’: os.path.join(BASE_DIR, ‘db.sqlite3’),
‘ENGINE’:‘django.db.backends.mysql’,
‘NAME’:‘djangohello’,
‘USER’:‘root’,
‘PASSWORD’:’******’,
‘HOST’:‘127.0.0.1’,
‘PORT’:‘3306’,
}
}
#pycharm要連線mysql需要在連線設定時間改為Asia/Shanghai
-
使用到的包
包名 用途 Django==3.0 後端網站框架 django-cors-headers==3.5.0 用於解決允許跨域問題 django-redis==4.12.1 redis快取 django-redis-cache==2.1.1 redis快取 PyMySQL==0.10.1 操作mysql資料庫 PyJWT==1.7.1 token加密編碼和解碼 -
建立專案
django-admin.py startproject project_name
-
新建app
python manage.py startapp app_name
-
生成遷移檔案並更新到資料庫
python manage.py makemigrations python manage.py migrate
-
執行專案
python manage.py runserver 後面可以加上 runserver 0.0.0.0:8000 埠可改
-
專案主檔案配置檔案更改
-
專案檔案settings.py
ALLOWED_HOSTS = ["*"]#將[]中加入*號 #註冊app INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', '****', '**', 'corsheaders',#允許跨域的app ] #新增跨域中介軟體 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'corsheaders.middleware.CorsMiddleware',#跨域中介軟體 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] CORS_ORIGIN_ALLOW_ALL = True #允許所有域名進行訪問 #新增資料庫 DATABASES = { 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': BASE_DIR / 'db.sqlite3', 'ENGINE': 'django.db.backends.mysql', 'NAME':'資料庫名', 'USER':'資料庫使用者名稱', 'PASSWORD':'密碼', 'HOST':'ip或者連結網址', 'PORT':'3306', } } #redis快取新增 CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } } } #將時間修改 LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = False
-
專案__init__.py
#將內建sql改為pymysql import pymysql pymysql.install_as_MySQLdb()
-
urls.py
#將app路由註冊到主程式中 from django.urls import path, include urlpatterns = [ # path('admin/', admin.site.urls), path('api/自定義/',include("自定義.urls")), path('api/自定義/',include("自定義.urls")), path('api/自定義/',include("自定義.urls")) ]
-
-
app檔案配置
-
新增urls.py檔案
from django.urls import path from app名稱 import views urlpatterns = [ path('index/',views.index), ]
-
view.py常用包
from django.core import serializers#將sql查詢出的資料轉換為json from django.core.paginator import Paginator#新增分頁器 from django.db.models import Q#用於新增執行多條件判斷語句 from django.http import JsonResponse#響應返回json資料 #分頁器使用 def index(request): data = {} page = int(request.GET.get("page", 1))#頁數 per_page = int(request.GET.get("per_page", 10))#每頁多少條資料 commentdata = Comment.objects.all().order_by('-Comment_time')#獲取所有資料,並按時間降序將最新的顯示在前面 paginator=Paginator(commentdata,per_page)#分頁器使用 page_data=paginator.page(page)#那一頁的資料 total=paginator.count#資料中有多少條資料 print(total) data['list'] = serializers.serialize("json", page_data)#資料庫物件轉換為json格式字元 data['total']=total # data.update({'csrf': csrfstr}) # print(type(data)) # print(data) return JsonResponse(data) Replydata = Reply.objects.filter(Q(Reply_replycoment__contains=text) & Q(Reply_replytime__gte=starttime) & Q(Reply_replytime__lte=endtime)).order_by('-Reply_replytime')#多條件篩選資料
-
model.py設定
class Comment(models.Model): Comment_id=models.BigIntegerField(db_column='commentid',null=True,unique=True) #評論id unique唯一 長int型別 Comment_text=models.TextField(db_column='commenttext',null=True) #評論內容 文字型別 Comment_num=models.IntegerField(db_column='commentnum',null=True) #回覆數 設定int Comment_username=models.CharField(max_length=100,db_column='自定義列名',null=True)#使用者 Comment_time=models.DateTimeField(db_column='commenttime',null=True, db_index=True )#建立時間 時間型別 class Meta: db_table='自定義表名'
-
-
-
知識補充
-
token建立與比對 匯入的是pyjwt包
import jwt import datetime from jwt import exceptions SALT = 'dfsdfdsdfsdfss*/[email protected]#gsdfgafadfhfghgh7645344321546y45798608$%^&*&*^%'#加密新增混淆的字元 #生成token 傳入使用者名稱和密碼 def create_token(username,password): # 構造header headers = { 'typ': 'jwt', 'alg': 'HS256' } # 構造payload payload = { 'username': username, # 使用者名稱 'password': password, # 密碼 'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1) # 超時時間 } token = jwt.encode(payload=payload, key=SALT, algorithm="HS256", headers=headers).decode('utf-8') print(token) return token def get_payload(token): """ 根據token獲取payload :param token: :return: """ try: # 從token中獲取payload【不校驗合法性】 # unverified_payload = jwt.decode(token, None, False) # print(unverified_payload) # 從token中獲取payload【校驗合法性】 verified_payload = jwt.decode(token, SALT, True) return True except exceptions.ExpiredSignatureError: msg='token已失效' return False except jwt.DecodeError: msg='token認證失敗' return False except jwt.InvalidTokenError: msg='非法的token' return False # if __name__ == '__main__': # create_token('fsd','dfa')
-
token驗證不是登入token,是跨域token驗證
if request.method == "GET": token = django.middleware.csrf.get_token(request) data={ 'code':200, 'csrftoken':token } return JsonResponse(data) #返回tokon後,前端將token儲存在cookie中之後資料請求帶上他才能正常訪問後臺資料
-
介面接受post資料,資料格式為json
request.method == "POST":#用於判斷請求型別 answerdic = json.loads(request.body)#將json格式資料轉換為字典
-
五、後端部署
-
-
安裝後臺伺服器
pip install uwsgi
-
將主專案檔案中的wsgi.py檔案拷貝一份將拷貝檔名改成專案名不是app名,字尾改成wsgi
-
新增uwsgi配置檔案,這個檔案你可以放在任何地方你能找到就行
[uwsgi] http = 127.0.0.1:8001 ;socket=127.0.0.1:8001 ;直接作為web伺服器使用 ;http=127.0.0.1:8000 ;程式主目錄 專案名稱就是spider 不是裡面的spider chdir =/pythonproject/spider/spider ;module=manage ;虛擬環境路徑 home =/pythonenvs/xin ;PYTHONHOME = /pythonenvs/spider/bin/ ;配置專案wsgi目錄相對於工程目錄 module=spider.wsgi:application ;callable=spider ;開啟記憶體使用情況報告 memory-report = true ;設定工作程序每處理N個程序就會被回收重啟 max-requests=500000 ;程序數 processes=4 #多執行緒 threads=10 ;多執行緒開啟 enable-threads=True ;後臺執行,並輸出日誌 daemonize = /pythonproject/spider/spider/uwsgi.log ;後臺執行的程序id pidfile= /pythonproject/spider/spider/uwsgi.pid http-timeout=100
注意:在配置檔案中;是註釋
在這裡就算是已http配置你還是不能在你伺服器ip地址訪問到的需要用nginx做反向代理(這是我在伺服器試過的,環境centos7.6,uwsgi為pip預設安裝版本,python3.6),但是我這沒必要因為前端使用nginx反向代理來訪問資料,前後端完全分離
-
uwsgi啟動
#後面最好用絕對路徑,命令 uwsgi --ini /pythonproject/spider/spider/uwsgi.ini
-
uwsgi停止
uwsgi --stop uwsgi.pid 這個命令要在uwsgi.pid檔案路徑中使用要不然提示找不到檔案 但是有時候不好用無法停止,強制停止 killall -s INT /usr/local/bin/uwsgi 缺點殺死所有uwsgi程序 還有個方式 ps -ef|grep uwsgi 顯示所有uwsgi 程序 kill -9 pid 一個一個殺掉
-