前言
此文章仅记录工作中使用python的一些经验
一、python打包exe文件
pip使用国内源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller
多模块打包
-p 后面跟的是你项目的独立运行环境路径 请使用绝对路径
-F是有命令行显示窗口的
–hidden-import 后面跟的是项目中的同目录下的模块
如果只有一个.py文件 后面都省略就行了
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*/-+@fdsdfasdfsdfs#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 一个一个杀掉
-