Python学习周总结(18.04.23 - 04.27)

    本周的学习内容以Django为核心进行展开,包括项目创建、模块创建、变量配置、模型构造、数据库连接、页面呈现等方面,具体内容如下所示:

1、Django简介
Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,模板T和视图V。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。

2、两种框架模式:
1)MVC(核心-->解耦,强制性的使应用程序的输入,处理和输出分开,减少各个模块之间的耦合性,方便变更,更容易重构代码,最大程度地实现了代码的复用):

M:Model --> 进行业务逻辑判断,数据库存取(数据存取层,主要负责数据库的CRUD)
V:View --> 根据业务逻辑选择不同的视图(表现层)
C:Controller--> 将用户输入的指令和数据传递给业务模型(业务逻辑层,主要负责业务逻辑的处理)

2)MTV(Django遵循的框架模式):
M:Model --> 负责业务与数据库的CRUD
T:Template --> 负责把渲染的页面展示给用户
V:View --> 负责业务逻辑并适当调用Model和Template(主要负责业务逻辑的处理)

注意:Django中还有一个url分发器,也叫作路由。主要用于将url请求发送给不同的View 处理,View再进行相关的业务逻辑处理

3、Django的常规操作
1)pip install virtualenv: 安装virtualenv(虚拟环境)(注:创建pycharm项目时需要指定虚拟环境,可以将不同版本的项目隔离开来,项目上线时要将环境和项目分离开)
2)pip install django==1.11: 安装django环境
3)virtualenv --no-site-packages -p xxx 文件名: 安装env环境。xxx --> 指定python版本所在的路径 or virtualenv --no-site-packages 文件名:安装env环境。使用默认版本的python解释器(注: --no-site-packages:纯净的虚拟环境,不包括外界的包/模块)
4)windows:
cd 环境名/Script --> activate | deactivate: 进入|退出env
Linux:
source bin/activate 进入
source deactivate 退出
5)django-admin startproject 项目名: 创建django项目
6)python manage.py startapp hello_app: 创建app(模块)。该命令是在工程下创建一个名为hello_app的app
app(模块内部文件简介):
init.py: 初始化,配置pymysql连接的地方
setting.py: 配置信息位置,databases等
urls.py: url路由,给每个请求寻找对应的方法
wsgi.py: 网关
admin.py: 管理后台注册模型
apps.py: settings.py里面注册app的时候需要使用到,一般不推荐直接使用
models.py:写模型的地方,定义数据库中的表结构
views.py:写处理业务逻辑的地方
7)settings
7.1)在settings.py文件中INSTALLED_APPS中写入创建的app的name or 导入apps.py文件中的APPCONFIG下的name属性
7.2)修改databases
7.3)修改templates -- os.path.join(BASE_DIR, 'templates')
7.4)设置语言 -- LANGUAGE_CODE = 'zh-hans'
7.5)修改时区 -- TIME_ZONE = 'Asia/Shanghai'
7.6)注释MIDDLEWARE中的'django.middleware.csrf.CsrfViewMiddleware'在
8)建立模型(位置:app.models.py)
定义的模型继承于models.Model
db_tables: 定义数据库中的表名称
模型字段:
CharField: 字符串
max_length: 最大长度
IntegerField: 整数
FloatField: 浮点数
BooleanField: 布尔类型(1,0)
DateField(auto_now_add=True/auto_now=True): 存放日期(年月日)
auto_now_add=True:第一次创建数据时设置时间(1次)
auto_now=True:每次登录、修改操作都会更新到最新时间(多次)
DateTimeField:年月日 时分秒
auto_now_add:同上
auto_now:同上
AutoField: 自动增长
DecimalField:
models.DecimalField(max_digits=3,decimal_places=1) 最大值99.9
max_digits: 总位数
decimal_places: 小数点后的位数
TextField: 存长文本信息,页面等
FileField: 文件上传字段
ImageField(upload_to=''): 上传图片
upload_to="":指定上传图片的路径
模型参数:
default='xxx':设置默认值
null=True: 设置是否为空,针对数据库中该字段是否可以为空
blank=True:设置是否为空,针对表单提交中该字段是否可以为空
primary_key=True:创建主键
unique:唯一

9)加载数据库(位置:project.init.py)
import pymysql
pymysql.install_as_MySQLdb():当成是mysqldb一样使用,当然也可以不写这句,那就按照pymysql的方式
10)数据库迁移
python manage.py makemigrations
python manage.py migrate
python manage.py makemigrations stu:强制找到stu模块进行迁移
Navicat中指定数据库中的表django_migrations记录了所有迁移记录
11)启动项目
python manage.py runserver ip:端口号(默认8000端口):启动django项目,端口号可以不用写,启动的时候会默认随机创建一个可以使用的端口

12)(*暂时可有可无)创建超级管理员的帐号和密码
python manage.py createsuperuser

4、Django过滤:
1)修改字段名
alter table table_name change 原名称 修改后名称 类型

    2)objects对象
         通过模型.objects来实现数据的增删查改(CRUD)操作

    3)获取所有学生信息
         select * from stu
         模型.objects.all()

    4)获取所有女生的信息
         select * from stu where stu_sex=False
         模型.objects.filter(stu_sex=False)[.fisrt():返回第一条数据 / .last():返回最后一条数据 / .count():求和]
                
         模型.objects.get(stu_sex=False)(只能获取一条数据不推荐使用)
   
    5)F()/ Q()
         from django.db.models import F,Q

5、关联
1:1 OneToOneField: 主键和外键是一对一关系,在关联表中,只能关联一个主表的id (一般添加到扩展表,关联到主表)
拓展表找主表:拓展信息对象.关联字段
主表找拓展表:主表对象.关联表的model_name
1:N OneToManyField
N:N MangToManyField

on_delete=xxx:删除主表的时候,从表的状态
        models.CASCADE:级联关系,主表删除,从表也删除(默认)
        models.SET_NULL:主表删除,从表关联字段设置为空
        models.PROTECT:不能删除主表
        models.SET_DEFAULT:主表删除,从表关联字段设置为默认值

6、前端操作
过滤器(|):在变量显示前修改
example: 语文成绩:{{stu.stu_chinese | add:10}} -- add:加法,增加值

    时间
           date:(在数据库中时间会比页面显示中少8个小时,操作时需要注意)
                  Y-完整年份(四位年)    m:月
                  y-简写年份(两位年)   n:日
                  H-时 24小时制            m:分
                  h-时 12小时制              s:秒
                  example: 创建时间:{{ stu.stu_create_time | date:'Y-m-d H:m:s' }}
    注释
           {# #}:单行注释
           {% comment %}{% endcommet %}:多行注释

    大小写
           upper | lower
           example : 姓名:{{ stu.stu_name | upper}} <!-- upper/lower:大小写转换 -->

   分数乘法运算
           widthratio 数 分母 分子
           example:语文成绩乘以10:{% widthratio stu.stu_chinese 1 10 %} 
                          <!-- stu.stu_chinese * 10(分子) / 1(分母)-->

   整除运算
          divisibleby:2  整除2,返回True,否则返回False
          example:数学成绩:{{ stu.stu_math | divisibleby:2}}  
                         <!-- 判断数学成绩是否能整除2 -->

  命名空间
           {% url 'namespace:name' value %}
          工程url中定义namespace
          模块url中定义name

  静态资源加载
         1)<img src="/static/images/xxx.png">
         2) {% load static %}
               <img src="{% static 'images/enemy1.png' %}">

 for:
         {% for stu in stus %}
         {% empty %}  # for中内容为空时执行的操作
         {% endfor %}
  
 if:
         {% if xxx %}
         {%  else  %}
         {%  endif %}

 ifequal:  # 如果相等时的操作
         {% ifequal xxx 1 %}
         {% else %}
         {% endifequal %}

 forloop
         计数从0开始: {{ forloop.counter0 }}
         计数从1开始: {{ forloop.counter }}
         计数从最后开始,到1停: {{ forloop.revcounter }}
         计数从最后开始,到0停: {{ forloop.revcounter0 }}

7、REQUEST处理
post -- 提交数据隐藏了
get -- 提交数据在url上, ?后跟参数,&用来连接多个参数,但是对参数的数量有限制,每个浏览器的限制不同
put 更新全部数据
patch 更新局部数据
delete:删除数据
example: stu_id = request.GET.get('stu_id')
Student.objects.filter(id=stu_id).delete()

8、COOKIE
cookie: 随着url移动,在浏览器
session: 在数据库
set_cookie(key,value,seconds): 设置cookie,并为其绑定令牌,令牌有过期时间,可以设置并存放在mysql或mongodb
1)绑定令牌到cookie里面,并将cookie存在前端
ticket = 'lalala'
response = HttpResponse()
response.set_cookie('ticket',ticket)
return response
2)cookie存在数据库中
user.u_ticket = ticket
user.save()
del_cookie(): 删除cookie

  常见问题见解:
  1)同一个浏览器登录两个qq空间,内容会互串 --> 原因:浏览器只能就一个应用程序保存一个cookie,即后登陆的空间的cookie,再访问的便是后登陆空间的内容

  2)cookie中是否有权限:cookie只是用于保存专属于一个特定用户的令牌,将每个用户分隔开来,用于和数据库端的令牌进行比对成功后进行后续操作而无需再输入帐号密码(一般cookie有生存时间,超时cookie将被删除,则需要重新登录,类似于淘宝、天猫长时间不操作便会要求重新登录),至于权限,数据库中应当专门存储权限表,并和指定用户关联

  3)cookie加密:不用,明码传输即可,一个人创建的令牌叫ticket,则另一个人创建的令牌则可能叫session

9、科普知识
1) Jinja2 --> Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能,这对大多应用的安全性来说是非常重要的。它基于unicode并能在python2.4之后的版本运行,包括python3
2)QueryDict和dict的区别 --> QueryDict定义在django.http.QueryDict,request对象的属性GET、POST都是QueryDict类型的对象,与python字典(dict)不同,QueryDict类型的对象用来处理同一个键带有多个值的情况
3)ORM(objects relational mapping): 对象关系映射,翻译机
4)alt + enter: 提示当前应用的函数所需要导入的包
5)path: 查看PATH路径中的内容

  通过本周的理论知识学习及实际应用项目的操练,笔者在一定程度上理解了MTV框架模式的原理,Django项目的设计流程,网站前后端交互的过程等,为后续基于Django的整站开发打下了基础,后续阶段需要进一步将css,html等内容融入到django项目中,使项目更加丰富、完整
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容