一、python 基础入门篇
1.python下载与安装
下载略。
pycharm 2019.3.2pj,https://www.cnblogs.com/fxzz/p/12016671.html
安装版本3.8,如下:
安装python的同时会帮我们装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]
-
文件操作
对文件不存在,抛出异常信息进行异常处理
-
文件的简单读取
-
读取大文件
- 通过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等信息
然后通过source ~/.bashrc即可生效。linux下创建python3的虚拟环境。
在上面虚拟环境创建完毕后,我们可以先在虚拟环境中,pip install django -i https://pypi.doubanio.com/simple,因为我们新建的是django框架的项目。
1.新建一个项目,New Project,这里由于应用都有个用户模块,所以在初始时新建一个名叫users的app
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.
并将原来user的app下的admin.py的东西删掉。然后再需要makemigrations及migrate将xadmin的表同步进来。
第二种是通过源码安装的方式:
在github官网搜索xadmin,将它的源码download下来。
下载下来以后,将里面的xadmin拷贝到我们的extra_apps中。
安装完后, 需要将model进行注册到xadmin中,在每个app下新建一个adminx.py(注这个名字固定,xadmin会自动搜索到)
独立使用django的model
Restful接口
踩坑:
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
ModelSerializer
class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = ['id', 'title', 'code', 'linenos', 'language', 'style']
如果想取出所有字段,(它会将外键序列化它的id)则可以:
如果我们不想只序列化外键id,则可以将外键所在的实体也定义一个serializer,然后进行嵌套即可。
GenericAPIView
from rest_framework import mixins
from rest_framework import generics
继承mixins.ListModelMixin, generics.GenericAPIView
如果 在里面不 写get请求 它是以为 你这方法 是不被允许get的,会提示错误“get”不被允许。
如果不想上面那么麻烦写get,可以通过继承ListApiView,因为它帮我们写好了。
一般列表页的数据都需要分页的,只需要在settings.py中配置如下:
当然 我们也可以自定义分页设置:
from rest_framework.pagination import PageNumberPagination
此时,之前在settings.py配置的page_size就不需要了。
viewsets和router完成商品列表页
from rest_framework import viewsets
通过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的原理分析
drf的过滤
DjangoFilterBackend官方教程
https://www.django-rest-framework.org/api-guide/filtering/#djangofilterbackend
显然,如上的过滤器的使用太限定了,所以我们可以通过自定义过滤器来实现灵活的过滤。https://django-filter.readthedocs.io/en/master/guide/rest_framework.html#quickstart
python 跨域问题
https://www.cnblogs.com/fiona-zhong/p/9720270.html
django信号量
当然别忘了还有一步操作,在users下面的apps.py中添加
用户创建
联合唯一
比如我们在用户收藏时,就可以这样设置:
添加提示消息 “已经收藏”
pycharm远程代码调试
tools->deployment->configuration
drf 缓存
pip install drf-extensions
然后将它的相关Import
再加进来即可。
在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有可能出错,所以。
会生成5张数据表。
然后添加自己想要的第三方登录,
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',
测试时,可以在微博开放平台设置回调地址,
另外还要配置appkey,appsecret
在登录成功后,指定登录跳转页面
- 常见web攻击
1.sql注入攻击及防范
对于用户的输入作合法性的判断。
2.xss攻击及防范
3.csrf攻击及防范
踩坑:
安装pip install django-filters不行,还是报找不到,后来卸载装的pip install django-filter