美文网首页
python 大杂烩~~~

python 大杂烩~~~

作者: 吴里庆庆 | 来源:发表于2019-12-05 23:37 被阅读0次

    一、python 基础入门篇

    1.python下载与安装
    下载略。
    pycharm 2019.3.2pj,https://www.cnblogs.com/fxzz/p/12016671.html

    安装版本3.8,如下:

    自定义安装
    不用管直接next
    image.png
    安装成功
    image.png

    安装python的同时会帮我们装idle,可以进行补全、代码保存等操作。


    idle
    输入exit() 退出交互页面。python扩展名.py。

    2.python基础用法

    字符串太长,可以用“\”代表换行。在python中不要随便缩进。标识符遵循两种命名规范,一:大驼峰YangMi,二:下划线小写字母 yang_mi

    在python中数值分整数、小数、复数三种。如果数字长度很大,可以使用下划线作分隔符。

    # 注释
    print('') # 单行注释
    print(r'C:\some\name') # 用r正常输出r,r代表可以输出原始字符串
    print("""\
    第一行
         缩进的第二行
         缩进的第三行
    """)# \代表忽略换行,不加会帮我们换行
    
    print(2 * '幂' + 'wq') # 幂幂wq
    
    
    word = 'Python'
    print(word[0]) # 输出P
    print(word[-0]) # 输出P
    print(word[0:5]) # 输出Pytho
    print(word[0:6]) # 输出Python
    print(word[0:100]) # 输出Python
    print(word[-6]) # 输出P
    
    print(2**4) # 输出2的4次方等于16 
    print(123_4567_890) # 1234567890 下划线作分隔符
    
    s = 'wuqing'
    print(len(s)) # 6
    
    # if
    x = int(input("Please enter an integer: "))
    # Please enter an integer: 42
    if x < 0:
        x = 0
        print('Negative changed to zero')
    elif x == 0:
        print('Zero')
    elif x == 1:
        print('Single')
    else:
        print('More')
    
    
    # 输出:
    # 庆 1
    # 幂幂 2
    words = ['庆', '幂幂']
    for w in words:
          print(w, len(w))
    
    words = ['cat', 'window', 'defenestrate']
    for w in words[:]:  # Loop over a slice copy of the entire list. 如果写成 for w in words:,这个示例就会创建无限长的列表,一次又一次重复地插入 defenestrate。
         if len(w) > 6:
            words.insert(1, w)
            # words.remove(w)
    print(words)
    
    for i in range(0,10,4):
          print(i, end=' ')  # 实现输出不换行
    
    print(list(range(0,10,4))) # [0, 4, 8]
    
    
    • 文件操作


      文件打开与关闭

      对文件不存在,抛出异常信息进行异常处理


      捕获文件不存在异常
    • 文件的简单读取


      文件简单读取
    • 读取大文件


      while循环读取大文件
    • 通过readline、readlines读取文件
    readline、readlines读取
    • 文件写入
    文件写入
    • 二进制文件
    file_name = 'c:/Users/ym/Desktop/爱的供养.flac'
    
    # 读取模式
    # t 读取文本文件(默认值)
    # b 读取二进制文件
    
    with open(file_name , 'rb') as file_obj:
        # 读取文本文件时,size是以字符为单位的
        # 读取二进制文件时,size是以字节为单位
        # print(file_obj.read(100))
    
        # 将读取到的内容写出来
        # 定义一个新的文件
        new_name = 'aa.flac'
    
        with open(new_name , 'wb') as new_obj:
    
            # 定义每次读取的大小
            chunk = 1024 * 100
    
            while True :
                # 从已有的对象中读取数据
                content = file_obj.read(chunk)
    
                # 内容读取完毕,终止循环
                if not content :
                    break
    
                # 将读取到的数据写入到新对象中
                new_obj.write(content)
    
    • 读取文件的位置
      英文的话一个字节也是一个字符,中文三个字节一个字符 。
    # with open('demo.txt','rb') as file_obj:
    #     # print(file_obj.read(100))
    #     # print(file_obj.read(30))
    
    #     # seek() 可以修改当前读取的位置
    #     file_obj.seek(55)
    #     file_obj.seek(80,0)
    #     file_obj.seek(70,1)
    #     file_obj.seek(-10,2)
    #     # seek()需要两个参数
    #     #   第一个 是要切换到的位置
    #     #   第二个 计算位置方式
    #     #       可选值:
    #     #           0 从头计算,默认值
    #     #           1 从当前位置计算
    #     #           2 从最后位置开始计算
    
    #     print(file_obj.read())
    
    #     # tell() 方法用来查看当前读取的位置
    #     print('当前读取到了 -->',file_obj.tell())
    
    with open('demo2.txt','rt' , encoding='utf-8') as file_obj:
        # print(file_obj.read(100))
        # print(file_obj.read(30))
    
        # seek() 可以修改当前读取的位置
        file_obj.seek(9)
        # seek()需要两个参数
        #   第一个 是要切换到的位置
        #   第二个 计算位置方式
        #       可选值:
        #           0 从头计算,默认值
        #           1 从当前位置计算
        #           2 从最后位置开始计算
    
        print(file_obj.read())
    
        # tell() 方法用来查看当前读取的位置
        print('当前读取到了 -->',file_obj.tell())
    
    • 文件的其他操作
    import os
    from pprint import pprint
    
    # os.listdir() 获取指定目录的目录结构
    # 需要一个路径作为参数,会获取到该路径下的目录结构,默认路径为 . 当前目录
    # 该方法会返回一个列表,目录中的每一个文件(夹)的名字都是列表中的一个元素
    r = os.listdir()
    
    # os.getcwd() 获取当前所在的目录
    r = os.getcwd()
    
    # os.chdir() 切换当前所在的目录 作用相当于 cd
    # os.chdir('c:/')
    
    # r = os.getcwd()
    
    # 创建目录
    # os.mkdir("aaa") # 在当前目录下创建一个名字为 aaa 的目录
    
    # 删除目录
    # os.rmdir('abc')
    
    # open('aa.txt','w')
    # 删除文件
    # os.remove('aa.txt')
    
    # os.rename('旧名字','新名字') 可以对一个文件进行重命名,也可以用来移动一个文件
    # os.rename('aa.txt','bb.txt')
    os.rename('bb.txt','c:/users/ym/desktop/wq.txt')
    
    pprint(r)
    

    二、django web端开发

    开发环境搭建

    下载一个conda包管理工具。

    • conda的包管理

    anaconda为我们提供方便的包管理命令——conda, 下面我们来看看都有哪些有用的命令吧!

    配置下国内镜像

    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
    
    # 查看已经安装的packages
    conda list
    # 查看已经安装的虚拟环境
    conda info --env
    # 查看某个指定环境的已安装包
    conda list -n python34
    
    # 查找package信息
    conda search numpy
    
    # 安装scipy
    conda install scipy
    
    # 安装package
    # 如果不用-n指定环境名称,则被安装在当前活跃环境
    conda install -n python34 numpy
    
    # 更新package
    conda update -n python34 numpy
    
    # 删除package
    conda remove -n python34 numpy
    由于conda将conda、python等都视为package,因此,完全可以使用conda来管理conda和python的版本,例如
    
    # 更新conda,保持conda最新
    conda update conda
    
    # 更新anaconda
    conda update anaconda
    
    # 更新python
    conda update python
    
    • 安装pycharm,略。
    配置下新建py文件的模板,可以添加作者、创建时间信息等。 配置模板
    • django项目start~~

    这一块的前提是我们首先在安装python的前提下,打开cmd,输入pip 命令有正常输出,则可以进行下一步安装虚拟环境,虚拟环境的目的保证我们的python应用间的独立,像版本升级啥的不会影响到其他项目。

    • virtualenv

    (1)pip install virtualenv
    virtualenv -p 指定python安装路径
    在linux 下安装virtualenv,sudu apt-get install python-virtualenv
    virtualenv 虚拟环境名称,source activate。这里我们测试下,
    (2)virtualenv testwqenv 创建一个虚拟环境
    这种不指定路径默认装在cmd当前运行目录的,然后创建完,可以进入到虚拟环境,通过cd testwqenv,dir列出文件列表,然后再进入Scripts目录,会发现有个activate.bat文件直接运行该文件。

    成功进入到我们的虚拟环境
    (3)可通过pip list查看当前的虚拟环境安装了哪些库。通过deactivate.bat退出虚拟环境。
    这种虚拟环境还得需要我们知道安装的虚拟环境目录,这样比较麻烦,所以接下来介绍另一种方式。
    • virtualenvwrapper

    (1)pip install virtualenvwrapper-win ,因为我们是在windows环境下安装,所以需要添加-win
    (2)mkvirtualenv wqwrapperenv 创建一个名为wqwrapperenv新的虚拟环境。安装完毕后,它会自动进入到我们的虚拟环境。如果想通过python3版本来安装 虚拟环境,则mkvirtualenv --python=python3的安装路径\python.exe [虚拟环境名称];
    (3)deactivate 退出虚拟环境
    (4)workon 查看当前有哪些虚拟环境
    workon 是virtualenvwrapper的一个命令,列出所有的虚拟环境。
    (5)rmvirtualenv 删除虚拟环境,慎用。
    (6)workon wqwrapperenv,进入到我们刚新建的wqwrapperenv的虚拟环境中。
    可以在环境变量里添加一个WORKON_HOME指定虚拟环境的目录,这样在创建虚拟环境时会自动识别到并创建在指定的目录下。如上是在windows下可以直接通过mkvirtualenv创建一个虚拟环境,但是linux下需要配置~/.bashrc修改workon_home等信息

    linux下需要配置
    然后通过source ~/.bashrc即可生效。linux下创建python3的虚拟环境。 linux下创建Python3的虚拟环境
    windows新建虚拟环境
    选择我们虚拟环境下的解释器

    在上面虚拟环境创建完毕后,我们可以先在虚拟环境中,pip install django -i https://pypi.doubanio.com/simple,因为我们新建的是django框架的项目。

    新建一个django项目需要指定虚拟环境

    1.新建一个项目,New Project,这里由于应用都有个用户模块,所以在初始时新建一个名叫users的app

    开始创建一个django项目

    2.在settings.py中配置mysql数据库,因为需要mysql数据驱动,先pip install mysqlclient。

    DATABASES = {
          'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': "gcgs_wechat",
            'USER': 'root',
            'PASSWORD': "123456",
            'HOST': "127.0.0.1"
        }
    }
    

    3.在settings.py中修改配置中文显示以及时区相关配置

    #设置时区
    LANGUAGE_CODE = 'zh-hans'  #中文支持,django1.8以后支持;1.8以前是zh-cn
    TIME_ZONE = 'Asia/Shanghai'
    USE_I18N = True
    USE_L10N = True
    USE_TZ = False
    

    4.配置静态文件目录以及媒体文件目录

    STATIC_URL = '/static/'
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR,'static') #需要在根目录下建立一个static目录
    ]
    MEDIA_URL = '/static/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR,'static/media') #它跟上面不一样不是列表
    
    ##完了以后搜索context_processors上添加media处理器
    'django.template.context_processors.media'
    

    4.引入include,配置users相关路由
    5.创建其他app

    python manage.py startapp app名称
    

    5.在settings.py中INSTALLED_APPS中添加刚创建的app
    6.在urls.py中配置分发子路由。
    7.由于创建了多个app和原有的都混在一个目录下,那么接下来我们可以自己创建一个包进行管理。新建一个python package命名为apps。再把我们之前创建的app全部移到新的apps包下,注意移的时候两个勾全部去掉。再给apps右击标记为sources root,将我们自己定义的包加入到python的搜寻环境变量中。(在setttings.py引入sys(python环境变量),将apps环境变量通过sys.path.insert进来) 如果有第三方的包我 们可以新建一个extra_apps存放也需要右击标记为sources root

    配置搜索路径

    8.在models.py中建立模型
    9.在settings.py中添加Auth_user_model来替换系统用户
    10.通过python manage.py makemigrations[可以跟app名,不跟的话就是全部]创建完再python manage.py migrate完成迁移
    python manage.py collectstatic
    11.导入导出可以通过python manage.py dumpdata > test.json导出数据,再通过python manage.py loaddata test.json将数据导入。

    启动项目

    python manage.py runserver

    python豆瓣源
    将原有应用下载的包的版本都导出到一个文件文件中:
    pip freeze > requirements.txt
    再在新应用中通过pip install -r requirements.txt -i https://pypi.doubanio.com/simple

    pip install virtualenv
    pip uninstall django
    pip install django -i https://pypi.doubanio.com/simple
    后面项目起来后,因为我们配置的是mysql数据库,还需要安装mysqlclient

    在windows安装包出错的时候,可以去此网站找。
    https://www.lfd.uci.edu/~gohlke/pythonlibs/

    常用的依赖包:

    安装djangorestframework
    pip install django -i https://pypi.doubanio.com/simple
    pip install markdown
    pip install django-filter

    安装过程

    mysqlclient
    pillow 图片处理的包

    第三方包

    DjangoUeditor

    migrations原理及表生成

    前提是要将我们之前定义的 app放在 settints.py里的INSTALLED_APPS中去。
    通过python manage.py makemigrations
    再python manage.py migrate
    之后 对表模型修改后都先执行上面两步,django怎么知道migrate哪一步呢,是因为在数据库里有张django_migrations表会记录已经运行了哪些文件。如果发现执行不了的时候,可以将某块的记录删除 ,这样它就能重新跑了。尽量使用代码的方式修改表信息。

    djangoadmin

    默认它是不会帮我们创建user的,我们可以通过createsuperuser来创建。默认是用户名和密码登录 的方式。在settings.py中修改配置中文显示以及时区相关配置。可以在users的app下修改admin.py注册我们的django管理系统。 注册管理系统

    xadmin

    有两种安装方式

    第一种:通过workon 我们的虚拟环境 ,然后pip install xadmin,安装完后在settings.py的installed_apps下将xadmin还有crispy_forms添加进来即可。然后在urls.py中进行修改,将原来的admin给替换成xadmin. image.png 并将原来user的app下的admin.py的东西删掉。然后再需要makemigrations及migrate将xadmin的表同步进来。

    第二种是通过源码安装的方式:

    在github官网搜索xadmin,将它的源码download下来。 下载xadmin 下载下来以后,将里面的xadmin拷贝到我们的extra_apps中。
    安装完后, 需要将model进行注册到xadmin中,在每个app下新建一个adminx.py(注这个名字固定,xadmin会自动搜索到)
    注册用户到xadmin中
    显示自定义
    自定义显示字段以及搜索字段、过滤字段

    独立使用django的model

    独立使用django的model

    Restful接口

    几大动词
    json格式返回
    modeltodict方式
    serializer序列化model
    image.png
    image.png

    踩坑:

    AttributeError: 'AutoSchema' object has no attribute 'get_link'异常处理

    REST_FRAMEWORK = {
        'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
    ),
        # 'DEFAULT_THROTTLE_CLASSES': (
        #     'rest_framework.throttling.AnonRateThrottle',
        #     'rest_framework.throttling.UserRateThrottle'
        # ),
        # 'DEFAULT_THROTTLE_RATES': {
        #     'anon': '2/minute',
        #     'user': '3/minute'
        # }
    }
    

    ApiView

    apiview

    ModelSerializer

    class SnippetSerializer(serializers.ModelSerializer):
        class Meta:
            model = Snippet
            fields = ['id', 'title', 'code', 'linenos', 'language', 'style']
    

    如果想取出所有字段,(它会将外键序列化它的id)则可以:


    取出所有字段

    如果我们不想只序列化外键id,则可以将外键所在的实体也定义一个serializer,然后进行嵌套即可。


    嵌套serializer

    GenericAPIView

    from rest_framework import mixins
    from rest_framework import generics
    继承mixins.ListModelMixin, generics.GenericAPIView
    如果 在里面不 写get请求 它是以为 你这方法 是不被允许get的,会提示错误“get”不被允许。


    GenericAPIView
    如果不想上面那么麻烦写get,可以通过继承ListApiView,因为它帮我们写好了。 ListApiView
    继承ListApiView
    一般列表页的数据都需要分页的,只需要在settings.py中配置如下:
    page_size配置
    当然 我们也可以自定义分页设置:
    from rest_framework.pagination import PageNumberPagination
    设置自定义分页

    此时,之前在settings.py配置的page_size就不需要了。

    viewsets和router完成商品列表页

    from rest_framework import viewsets



    url配置

    通过router配置url,会更方便。
    from rest_framework.routers import DefaultRouter
    router = DefaultRouter()
    router.register(r'goods', views.GoodsViewSet)
    urlpatterns = [
    path(r'^', include(router.urls)),
    ]

    drf的Apiview、GenericView、Viewset和router的原理分析

    image.png

    drf的过滤

    drf的过滤

    DjangoFilterBackend官方教程

    https://www.django-rest-framework.org/api-guide/filtering/#djangofilterbackend

    DjangoFilterBackend
    显然,如上的过滤器的使用太限定了,所以我们可以通过自定义过滤器来实现灵活的过滤。https://django-filter.readthedocs.io/en/master/guide/rest_framework.html#quickstart
    DjangoFilterBackend

    python 跨域问题

    https://www.cnblogs.com/fiona-zhong/p/9720270.html
    django信号量

    利用django信号量修改密码
    当然别忘了还有一步操作,在users下面的apps.py中添加 apps.py中引入信号量
    用户创建
    用户创建
    联合唯一
    比如我们在用户收藏时,就可以这样设置: 联合唯一设置
    通过drf验证唯一 添加提示消息 “已经收藏” 已经收藏

    pycharm远程代码调试

    tools->deployment->configuration

    配置远程环境
    选择sftp

    drf 缓存

    pip install drf-extensions

    然后将它的相关Import import进来
    再加进来即可。 加入到viewset中
    在setting中配置过期时间为5秒。 配置过期时间(全局)

    drf配置redis缓存

    由于 上一节是通过内存缓存,每次项目重启缓存数据就没了,所以 我们可以配置 redis进行数据缓存。Github搜索星星多的项目它有中文开发文档滴。https://django-redis-chs.readthedocs.io/zh_CN/latest/

    pip install django-redis

    • 在setting中加入如下配置
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379/1",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        }
    }
    

    drf的throttle设置api的访问速率

    文档地址https://www.django-rest-framework.org/api-guide/throttling/
    为了防止爬虫,所以 我们需要将api进行访问速率的限制。限速也是drf自带的功能,所以 不需要 安装第三方的应用 。
    在配置文件中,将如下拷贝到drf的配置 中,如下:

    REST_FRAMEWORK = {
        'DEFAULT_THROTTLE_CLASSES': (
            'rest_framework.throttling.AnonRateThrottle',
            'rest_framework.throttling.UserRateThrottle'
        ),
        'DEFAULT_THROTTLE_RATES': {
            'anon': '100/day',
            'user': '1000/day'
        }
    }
    

    其中,两个限速类,AnonRateThrottle是用户未登录的情况 下;另一个UserRateThrottle是用户登录的情况下。它们两个限速规则是不一致的。anon匿名用户,设置时间区间。100/day 一天可访问100次,它的单位有 second, minute, hour or day .

    • 然后配置代码中使用我们的限速
    from rest_framework.throttling import UserRateThrottle
    throttle_classes = (UserRateThrottle,)
    

    如果超出了限制,会提示429Too many requests的错误信息。

    django 第三方登录

    可以转移githubhttps://github.com/python-social-auth/social-app-django文档http://python-social-auth.readthedocs.io/

    微博开发文档https://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E

    • 实现过程
    $ pip install social-auth-app-django
    
    INSTALLED_APPS = (
        ...
        'social_django',
        ...
    )
    
    # 因为第三方登录 提供了额外的数据表 由于它migrations已经帮我们生成好了 所以直接migrate
    ./manage.py migrate
    
    

    由于mysql默认用的表类型是myisam,这个其实一开始我就将它设为了innodb,因为django里面有一些默认的model不适配myisam有可能出错,所以。

    表类型改成innodb

    会生成5张数据表。


    social_auth数据表

    然后添加自己想要的第三方登录,

    AUTHENTICATION_BACKENDS = (
        'social_core.backends.weibo.WeiboOAuth2',
        'django.contrib.auth.backends.ModelBackend',
    )
    

    接下来在我们的url配置如下
    这里提一嘴,就是我们下方配置的url默认也是login/开头的,会和我们之前 配过的有冲突,导致默认进入我们之前配置过的,所以我们可以在之前配置的login/,“”表示结尾。

    # 第三方登录url
        url('', include('social_django.urls', namespace='social'))
        
    

    在setting中加入:

    'context_processors': [
                    ...
                    'social_django.context_processors.backends',
                    'social_django.context_processors.login_redirect',
    
    Context Processors
    测试时,可以在微博开放平台设置回调地址, 微博开放平台设置回调地址
    另外还要配置appkey,appsecret 配置开放平台应用信息
    在登录成功后,指定登录跳转页面 指定登录成功后跳转首页
    • 常见web攻击

    1.sql注入攻击及防范
    对于用户的输入作合法性的判断。
    2.xss攻击及防范

    3.csrf攻击及防范

    踩坑:
    安装pip install django-filters不行,还是报找不到,后来卸载装的pip install django-filter

    Flask篇

    相关文章

      网友评论

          本文标题:python 大杂烩~~~

          本文链接:https://www.haomeiwen.com/subject/oixsgctx.html