python个人经验总结1


前言

此文章仅记录工作中使用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个:

  1. 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”是路径 使用时请改成你自己的路径

  2. 进入pycharm的独立环境路径下
    找到pycharm创建的独立环境路径下:我的是E:\py项目独立环境.envs\flask初体验
    “flask初体验”是同名的项目但是其他项目也可以用这个虚拟环境
    找到在这里插入图片描述
    进入该目录Scripts然后命令行来到该目录执行activate命令,进入该虚拟环境
    在这里插入图片描述
    这时候你执行pip install 包名 就可以安装在该虚拟环境下了(虚拟环境方便包管理)
    如果你使用的是
    在这里插入图片描述
    执行的时候请加上.\activate
    在这里插入图片描述

  3. 在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

  1. 使用到的包

    包名用途
    Django==3.0后端网站框架
    django-cors-headers==3.5.0用于解决允许跨域问题
    django-redis==4.12.1redis缓存
    django-redis-cache==2.1.1redis缓存
    PyMySQL==0.10.1操作mysql数据库
    PyJWT==1.7.1token加密编码和解码
  2. 创建项目

    django-admin.py startproject project_name
    
  3. 新建app

    python manage.py startapp app_name
    
  4. 生成迁移文件并更新到数据库

    python manage.py makemigrations
    python manage.py migrate
    
  5. 运行项目

    python manage.py runserver 
    后面可以加上 runserver 0.0.0.0:8000 端口可改
    
  6. 项目主文件配置文件更改

    1. 项目文件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
      
      
      
    2. 项目__init__.py

      #将内置sql改为pymysql
      import pymysql
      pymysql.install_as_MySQLdb()
      
    3. 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"))
      ]
      
  7. app文件配置

    1. 添加urls.py文件

      from django.urls import path
      from app名称 import views
      urlpatterns = [
          path('index/',views.index),
      ]
      
    2. 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')#多条件筛选数据
         
      
      
      1. 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='自定义表名'
        

  8. 知识补充

    1. 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')
      
    2. 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中之后数据请求带上他才能正常访问后台数据   
      
      
    3. 接口接受post数据,数据格式为json

      request.method == "POST":#用于判断请求类型
      answerdic = json.loads(request.body)#将json格式数据转换为字典
      

五、后端部署

    1. 安装后台服务器

      pip install uwsgi
      
    2. 将主项目文件中的wsgi.py文件拷贝一份将拷贝文件名改成项目名不是app名,后缀改成wsgi

    3. 添加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反向代理来访问数据,前后端完全分离

    4. uwsgi启动

      #后面最好用绝对路径,命令
      uwsgi --ini /pythonproject/spider/spider/uwsgi.ini 
      
    5. uwsgi停止

      uwsgi --stop uwsgi.pid
      这个命令要在uwsgi.pid文件路径中使用要不然提示找不到文件
      但是有时候不好用无法停止,强制停止
      killall -s INT /usr/local/bin/uwsgi  
      缺点杀死所有uwsgi进程
      还有个方式
      ps -ef|grep uwsgi
      显示所有uwsgi 进程
      kill -9 pid
      一个一个杀掉
      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值