# 1
# li = ['a', 'b', 'c', 'd','e']
# print(li[10:]) #[] 不报错 # 2
# 这不是True或False,而是值
# 另外,优先级 not > and > or
# print(1 and 2 or 3) # 2
# print(2 and 0 or 1) # 1
# print(1 or 2 and 0) # 1
# print(2 or 0 and 1) # 2
# print(not 1 and 0) # 3
# x1 = 'a'
# x2 = 'b'
# list1 = [1,2]
# list2 = [3,4]
# list3 = [5,6]
# list4 = [x1, x2, list1, list2, list3] # ['a', 'b', [1,2], [3,4], [5,6]]
#
# ### 考察对"引用"的理解
#
# x1 = 'c' # x1 = 'c'
# list1[0] = 7 # list1 = [7,2]
# print(list4) # ['a', 'b', [7,2], [3,4], [5,6]]
#
# list4[1] = 'd' # ['a', 'd', [7,2], [3,4], [5,6]]
# print(x2) # 'b'
#
# list4[3] = [8,9] # ['a', 'd', [7,2], [8,9], [5,6]]
# print(list2) # [3,4],
# # 也就是修改list4的引用,原来指向list2,现在指向[8,9],所以对list2没影响。
#
# list4[4][1] = 10 # ['a', 'd', [7,2], [8,9], [5,10]]
# print(list3) # [5,6],
# # 这个做错了,list4[4]还是指向list3,修改list4[4][1]已经影响到了list3。
# print(list4) # 4
# 下面是否有错:
# def calc(a, b, c, d=1, e=2):
# return (a + b) * (c - d) + e
#
# print(calc(1, 2, 3, d=5, 4)) #关键字参数一定要放到位置参数后面 # 5
# 互换
# x = [0,1]
# i = 0
# i,x[i] = 1,2
# print(x) # [0,2] # a = 1
# b = 2
# a, b = b, a
# print(a,b)

Django:

MVC:model、view、controller

MTV:model、template、view

django-admin startproject mysite

python manage.py startapp myapp (mysite目录下执行)

python manage.py runserver 8080 (默认8000)

添加模板:

根目录下创建文件夹templates(名字任意,只是需要与settings.py中对应)

settings.py中设置'DIRS': [os.path.join(BASE_DIR, 'templates')],

给html文件传参:

 def retok(req):
date = datetime.datetime.now()
return render(req, 'ret.html', {'date': date}) # django没有'**'

post方法403 Forbidden:

中间件,'django.middleware.csrf.CsrfViewMiddleware',

请求方法大写:

 def info(req):
if req.method == 'POST': # 必须大写
print(req.POST.get('name')) # 接收请求信息
return HttpResponse('ok')
return render(req, 'info.html')

模板jinjia2取值:

无论列表还是字典都可用 '.'

 {{info_list.0}}
<table border="1">
{% for info in info_list %}
<td>{{ info.name }}</td>
<td>{{ info.age }}</td>
{% endfor %}
</table>

model模块:

创建model之后,初始化之前需要在settings.py中配置app,

 INSTALLED_APPS = [
...
'myapp'
]

python manage.py makemigrations

python manage.py migrate

一个pycharm社区版引起的血案:

执行数据库初始化之后,怎么也找不到database插件,原因是pycharm社区版只支持纯python开发,专业版才支持HTML、JS、SQL。

sqlite3表中插入数据:

 # model.py

 class Info(models.Model):
name = models.CharField(max_length=10)
age = models.CharField(max_length=10)
pwd = models.CharField(max_length=10) # views.py Info.objects.create(
name=n,
age=a,
pwd=p,
)

配置静态文件,以jQuery为例:

 # settings.py

 STATIC_URL = '/yangxl/'  # html中寻找静态文件用的是该路径

 STATICFILES_DIRS = [
(os.path.join(BASE_DIR, 'static')), # 文件名任意, 但逗号不能丢
] # .html <h1>旺财</h1>
<script src="/yangxl/jquery-3.4.1.min.js"></script>
<script>
$('h1').css('color', 'red')
</script>

路由匹配:path、re_path,

通过正则分组给视图函数传参

 # urls.py

 from django.urls import path, re_path
from myapp import views urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'info/([0-9]{3})', views.info),
] # views.py def info(req, n):
return HttpResponse(n)

关键字参数,

 # urls.py

     re_path(r'info/(?P<num1>[0-9]{3})/(?P<num2>[0-9])', views.info),

 # views.py

 def info(req, num1, num2):
return HttpResponse(num1+num2) # 字符串拼接

传入一个与路径无关的参数,

     re_path(r'info/(?P<num1>[0-9]{3})/(?P<num2>[0-9])', views.info, {'environ': 'yangxl'}),

别名name,当访问url发生变化时,不需修改form、a等二次访问的url,

 # urls.py

     re_path(r'info', views.info, name='genesis'),

 # .html

 <form action="{% url 'genesis' %}" method="post">
<input type="text" name="user">
<input type="password" name="pwd">
<input type="submit" value="提交">
</form>

include,路由分发,

 # urls.py

 from django.urls import path, include

 urlpatterns = [
...
path('backend', include('backend.urls')),
] # app.urls.py from django.urls import path, re_path
from backend import views urlpatterns = [
re_path('info', views.info, name='genesis'),
] 访问:http://127.0.0.1:8080/backend/info

req为WSGIRequest对象,

from django.core.handlers.wsgi import WSGIRequest
from django.http import HttpRequest

返回一个HttpResponse对象,

from django.http import HttpResponse
render、render_to_response、redirect、HttpResponse

django命令行模式:

 python manage.py shell

 In [1]: from django.template import Template, Context

 In [2]: t = Template('hello{{name}}')

 In [3]: c = Context({'name': 'wangcai'})

 In [4]: t.render(c)
Out[4]: 'hellowangcai'

关于import,无论是在mysite.urls.py还是backend.urls.py都能导入views (from backend import views),因为环境变量sys.path[0]为项目根目录。

模板语法提示功能:

Settings -- Editor -- Inspections -- Django、python都选上。

forloop.counter、forloop.counter0:

 {% for i in l%}
<p>{{ forloop.counter0 }}: {{ i }}</p>
{% endfor %}

filter:'|'

 {{ s }}
{{ s|upper }}
{{ s|capfirst }}

autoescape:

效果等同于{{ s|safe }}

 def info(req):
s = '<a href="#">中南海</a>'
return render(req, 'index.html', {'s': s}) {% autoescape off %} # 结果渲染,意会!!
{{ s }}
{% endautoescape %}

{% csrf_token %}:

解决post方法遇到的403 Forbidden问题,

 # .html
<form action="info" method="post">
<input type="text" name="user">
<input type="pwd" name="pwd">
<input type="submit" value="submit">
{% csrf_token %}
</form> 提交表单时多加一个input标签,
<input name="csrfmiddlewaretoken" type="hidden" value="5i5jCtZj8PRpxha7U6Tct2lxEvXyTUQ0iIaswDqRhXNI2SGXjNoWyMYiMDlNm3B4">

不渲染,{{ s }}

 {% verbatim %}
{{ s }}
{% endverbatim %} 结果:{{ s }}

自定制模板函数:

必须在已注册app中创建名为templatetags的文件夹,文件夹下的文件名任意,(已注册是指在settings.INSTALLED_APPS中)。

 # views.py

 def info(req):
s = 'wangcai'
return render(req, 'index.html', {'s': s}) # templatetags.customs.py from django import template register = template.Library() # register @register.simple_tag # simple_tag
def use_salt(s):
return 'hello, ' + s # .html {% load customs %} # 在使用之前导入模块 {% use_salt s %} # 去导入的模块customs.py中获取函数并执行

自定制过滤器:只有装饰器和调用方式不同,

 # customs.py

 @register.filter
def ... # .html {{ s|use_salt }}

二者加参数,

 {% use_salt s 'come here' %}
{{ s|use_salt:', come here' }}

extends:在母版中定义共同的部分和一个盒子,在子模版中导入母版并用各自的内容填充盒子

 # base.html

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.page-header{
height: 50px;
background-color: rebeccapurple;
}
.page-body .menu{
height: 500px;
background-color: antiquewhite;
float: left;
width: 20%;
}
.page-body .content{
height: 500px;
background-color: cornflowerblue;
float: left;
width: 80%;
}
.page-footer{
height: 50px;
background-color: darkcyan;
clear: both;
}
</style>
</head>
<body>
<div>
<div class="page-header"></div>
<div class="page-body">
<div class="menu">
<a href="/order">订单</a>
<a href="/shop">购物</a>
</div>
{% block aigo %} # 盒子 {% endblock %}
</div>
<div class="page-footer"></div>
</div>
</body>
</html> # order.html {% extends 'base.html' %} # 导入母版 {% block aigo %} # 填充盒子
<div class="content">
订单啊
</div>
{% endblock %}

model、ORM:

单表操作:

     # 增
user = {'name': 'grute', 'age': 3, 'pwd': 123}
models.Info.objects.create(**user) # 查
users = models.Info.objects.all()
users = models.Info.objects.filter(id__gte=1) # <QuerySet []>, 双下划线, 可切片操作
users = models.Info.objects.get(id=1) # 找不到数据会报错
users = models.Info.objects.all().values('id', 'name') # 特定字段
users = models.Info.objects.exclude(id=3) # 反向查找
users = models.Info.objects.exclude(id=3).count() # 计数
users = models.Info.objects.filter(id=2).last()
users = models.Info.objects.filter(id=2).first()
users = models.Info.objects.filter(id=1).exists() # 是否存在该条数据, bool, 惰性机制(比如, 还有迭代器)
print('uu', users) # 改
models.Info.objects.filter(id=2).update(name='wangcai', age=16) # update是QuerySet的方法 # 删
models.Info.objects.filter(id=1).delete() # 排序
users = models.Info.objects.order_by('-id') # 倒序
print('uu', users)

联表操作:一对一、多对一、多对多

 # models.py

 class Book(models.Model):
title = models.CharField(max_length=64)
price = models.IntegerField()
color = models.CharField(max_length=64)
page_num = models.IntegerField(null=True)
publisher = models.ForeignKey('Publisher', models.CASCADE)
# 接受对象
author = models.ManyToManyField('Author') # 多对多, 放到Author中也可 def __str__(self):
return self.title class Publisher(models.Model):
name = models.CharField(max_length=64)
city = models.CharField(max_length=63) def __str__(self):
return self.name class Author(models.Model):
name = models.CharField(max_length=30) def __str__(self):
return self.name # views.py def info(req):
# models.Publisher.objects.create(
# name='新东方技工学校',
# city='济南',
# ) # models.Author.objects.create(
# name='紫英'
# ) # pubs = models.Publisher.objects.filter(city='济南')
# author1 = models.Author.objects.get(id=2)
# author2 = models.Author.objects.get(id=3)
# print('aa', author2) # book = models.Book.objects.create(
# title='挖掘机切磋技法',
# price=32,
# color='blue3',
# # 多对一, 二选一
# # publisher_id=2, # id
# publisher=pubs[0] # 对象, 推荐
# )
# 多对多
# 正向查询
# book = models.Book.objects.filter(id=3)[0]
# authors = models.Author.objects.filter(id=3)
# book.author.remove(*authors) # 类似集合操作,删除为remove
# 反向查询
author = models.Author.objects.filter(id=3)[0]
books = models.Book.objects.filter(id__gte=2)
author.book_set.add(*books) return HttpResponse('ok')

多对一查找:

     # 多对一
# 正查
book = models.Book.objects.filter(title='挖掘机切磋技法')[0]
print(book.publisher.name)
# 反查
pubs = models.Publisher.objects.filter(name='新东方技工学校')[0]
print(pubs.book_set.values('title')) # QuerySet
print(pubs.book_set.values('title').distinct()) # 根据title去重

手动创建第三张表,这样就不需创建多对多字段了

 # models.py

 class Book2Author(models.Model):
book = models.ForeignKey('Book', models.CASCADE)
author = models.ForeignKey('Author', models.CASCADE) class Meta:
unique_together = ['book', 'author'] # views.py
# 直接插入数据
author = models.Author.objects.filter(id=3)[0]
book = models.Book.objects.filter(id__gte=2)[0]
models.Book2Author.objects.create(
book=book,
author=author
)

一对一:

 # models.py

     # publisher = models.ForeignKey('Publisher', models.CASCADE, unique=True)
publisher = models.OneToOneField('Publisher', on_delete=models.CASCADE) # 推荐

双下划线,条件查询:

     # 单表查询
# book = models.Book.objects.filter(id__range=[4, 7])
# book = models.Book.objects.filter(id__in=[3, 5])
# book = models.Book.objects.filter(title__contains='技法')
# book = models.Book.objects.filter(title__icontains='技法') # 不区分大小写
# book = models.Book.objects.filter(title__startswith='酸菜') # 正向多对一
# books = models.Book.objects.filter(title='挖掘机切磋技法').values('id')
# books = models.Book.objects.filter(title='挖掘机切磋技法').values('publisher__city') # 正向多对多
# books = models.Book.objects.filter(author__name='菱纱').values('title') # 反向一对多
# pubs = models.Publisher.objects.filter(book__title='挖掘机切磋技法').values('name')
# pubs = models.Publisher.objects.filter(book__title='酸菜鱼攻略').values('book__author__name') # 反向多对多
authr = models.Author.objects.filter(book__title='挖掘机切磋技法').values('name')
print(authr)

django日志配置,

可用于验证filter等的惰性机制(只有使用filter的返回结果时真正执行sql语句)

 LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level': 'DEBUG',
},
}
}

缓存机制:

     pubs = models.Publisher.objects.filter(city='成都')
for p in pubs:
print(p) # pubs.update(city='重庆') for p in pubs: # 当再次执行遍历操作且遍历数据未改变时, 数据是从缓存中获取的, 不会重复执行sql查询
print(p)

以下两条不会把数据加载到缓存,

     pubs = models.Publisher.objects.filter(city='重庆').exists()
pubs = models.Publisher.objects.filter(city='成都').iterator()

聚合查询、分组查询,

aggregate和annotate:

     from django.db.models import Avg, Min, Max, Sum

     # 查询菱纱出的书的均价
# books = models.Book.objects.filter(author__name='菱纱').aggregate(Avg('price')) # 聚合查询 # 查询各个作者出的书的总价格
# books = models.Book.objects.values('author__name')
# books = models.Book.objects.values('author__name').annotate(Sum('price')) # annotate对作者分组(可重复), 然后按价格聚合 # 查询各个出版社最便宜的书的价格
# books = models.Book.objects.values('publisher').annotate(Min('price'))

F和Q查询:

     from django.db.models import F, Q

     # 把菱纱出的书的价格提高100
books = models.Book.objects.filter(author__name='菱纱').update(price=F('price')+100) # 返回更新数据的个数 # &、|、~
books = models.Book.objects.filter(Q(id=3) | Q(price__lt=100)) # 或关系
books = models.Book.objects.filter(Q(id__gte=5) & Q(price__lt=150), color='green') # 关键字参数放在Q后面

Admin:

python manage.py createsuperuser

汉化:

 # LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-Hans'

指定表字段,verbose_name,后加的不需数据库初始化

 title = models.CharField(max_length=64, verbose_name='书名')

设置某字段只读,editable

 title = models.CharField(max_length=64, verbose_name='书名', editable=False)

django连接mysql:

 ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have
0.9.3.
# django.db.backends.mysql.base.py py3中编码也有问题
# django.db.backends.mysql.operations.py
 # settings.py

 DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': '',
'USER': 'root',
'PASSWORD': '',
'NAME': 'wangcai',
}
} # app下的__init__.py import pymysql
pymysql.install_as_MySQLdb() # 初始化
python manage.py makemigrations
python manage.py migrate # django-database插件显示mysql,这个因为时区问题无法连接,懒得配置了。。

django-database插件显示mysql,这个因为时区不匹配而无法连接,需要做以下配置,

 # 修改mysql时区为东八区

 show variables like '%time_zone%';
set global time_zone='+8:00';
flush privileges;

非常秀的博客:

https://www.cnblogs.com/yuanchenqi/articles/6083427.html

python中的细节的更多相关文章

  1. python中装饰器的执行细节

    本文代码借用 廖雪峰的python教程(官网:http://www.liaoxuefeng.com/) 不了解装饰器的可以先看教程 直接上带参数装饰器的代码 def log(text): def de ...

  2. python2.7高级编程 笔记二(Python中的描述符)

    Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...

  3. 如何在Python中实现这五类强大的概率分布

    R编程语言已经成为统计分析中的事实标准.但在这篇文章中,我将告诉你在Python中实现统计学概念会是如此容易.我要使用Python实现一些离散和连续的概率分布.虽然我不会讨论这些分布的数学细节,但我会 ...

  4. 详解 Python 中的下划线命名规则

    在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单 ...

  5. Python 中的进程、线程、协程、同步、异步、回调

    进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...

  6. python中列表和元组以及字符串的操作

    python中列表是非常好用的.不过有一些使用小细节还需要注意一下. tag[32:-4] 从index为32到tag的倒数第4个字符. 如果索引为32的值在倒数第4个字符的右边,那么将输出为空.只要 ...

  7. Python中的Class的讨论

    尽管Python在Function Programming中有着其他语言难以企及的的优势,但是我们也不要忘了Python也是一门OO语言哦.因此我们关注Python在FP上的优势的同时,还得了解一下P ...

  8. [转]Python中urllib与urllib2的区别与联系

    引用文章1:http://my.oschina.net/u/558071/blog/144792 引用文章2:http://zhuoqiang.me/python-urllib2-usage.html ...

  9. python中的MySQL数据库操作 连接 插入 查询 更新 操作

    MySQL数据库 就数据库而言,连接之后就要对其操作.但是,目前那个名字叫做qiwsirtest的数据仅仅是空架子,没有什么可操作的,要操作它,就必须在里面建立“表”,什么是数据库的表呢?下面摘抄自维 ...

随机推荐

  1. 微软BI 之SSIS 系列 - 变量查询语句引起列输出顺序不一致的解决方法

    开篇介绍 这个问题来自于 天善BI社区,看了一下比较有意思,因为我自己认为在 SSIS中处理各种类型文件的经验还比较丰富(有一年的时间几乎所有ETL都跟文件相关),但是这个问题确实之前没有特别考虑过. ...

  2. eclipse plugin development -menu

    org.eclipse.ui.menus locationURI MenuContribution locationURI = "[Scheme]:[id]?[argument-list]& ...

  3. 按装 autoconf 出现 需要安装m4-1.4.16.tar.gz的错误

    root@suzgc # /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config - ...

  4. WRI$_ADV_OBJECTS表过大,导致PDB的SYSAUX表空间不足

    现象监控发现sysaux表空间使用不断增加,导致表空间不足 查看过程 查看版本: SQL> select * from v$version; BANNER CON_ID ------------ ...

  5. MySQL 5.6新特性 -- Index Condition Pushdown

    Index Condition Pushdown(ICP)是针对mysql使用索引从表中检索行数据时的一种优化方法.   在没有ICP特性之前,存储引擎根据索引去基表查找并将数据返回给mysql se ...

  6. js数组相关知识集合

    一.js数组快速排序 <script type="text/javascript"> var arr = [1, 2, 3, 54, 22, 1, 2, 3]; fun ...

  7. 【iCore4 双核心板_ARM】例程十一:DMA实验——存储器到存储器的传输

    实验原理: DAM(直接存储器访问)传输不需要占用CPU,可以在存储器至存储器实现高速的数据 传输.本实验采用DAM2控制器的数据流0,选用通道0进行数据传输.通过LED的颜色来 判断传输是否成功. ...

  8. 初识Spring Security

    本文参考或者转自:http://haohaoxuexi.iteye.com/blog/2154299 1.新建Spring Security配置文件spring-security.xml:<?x ...

  9. 【转】xhEditor技术手册 网页编辑器基础教程

    1. xhEditor入门基础 1.1. 在线可视化HTML编辑器概述1.2. 获取xhEditor1.3. xhEditor运行环境1.4. xhEditor基本使用指南 1.1. 在线可视化HTM ...

  10. ORA-00257:archiver error问题处理方法

    原文链接:http://www.7747.net/database/201109/104615.html ORA-00257: archiver error. Connect internal onl ...