python 大杂烩~~~

一、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 大杂烩~~~)