python中的细节
# 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中的细节的更多相关文章
- python中装饰器的执行细节
本文代码借用 廖雪峰的python教程(官网:http://www.liaoxuefeng.com/) 不了解装饰器的可以先看教程 直接上带参数装饰器的代码 def log(text): def de ...
- python2.7高级编程 笔记二(Python中的描述符)
Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...
- 如何在Python中实现这五类强大的概率分布
R编程语言已经成为统计分析中的事实标准.但在这篇文章中,我将告诉你在Python中实现统计学概念会是如此容易.我要使用Python实现一些离散和连续的概率分布.虽然我不会讨论这些分布的数学细节,但我会 ...
- 详解 Python 中的下划线命名规则
在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单 ...
- Python 中的进程、线程、协程、同步、异步、回调
进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...
- python中列表和元组以及字符串的操作
python中列表是非常好用的.不过有一些使用小细节还需要注意一下. tag[32:-4] 从index为32到tag的倒数第4个字符. 如果索引为32的值在倒数第4个字符的右边,那么将输出为空.只要 ...
- Python中的Class的讨论
尽管Python在Function Programming中有着其他语言难以企及的的优势,但是我们也不要忘了Python也是一门OO语言哦.因此我们关注Python在FP上的优势的同时,还得了解一下P ...
- [转]Python中urllib与urllib2的区别与联系
引用文章1:http://my.oschina.net/u/558071/blog/144792 引用文章2:http://zhuoqiang.me/python-urllib2-usage.html ...
- python中的MySQL数据库操作 连接 插入 查询 更新 操作
MySQL数据库 就数据库而言,连接之后就要对其操作.但是,目前那个名字叫做qiwsirtest的数据仅仅是空架子,没有什么可操作的,要操作它,就必须在里面建立“表”,什么是数据库的表呢?下面摘抄自维 ...
随机推荐
- 微软BI 之SSIS 系列 - 变量查询语句引起列输出顺序不一致的解决方法
开篇介绍 这个问题来自于 天善BI社区,看了一下比较有意思,因为我自己认为在 SSIS中处理各种类型文件的经验还比较丰富(有一年的时间几乎所有ETL都跟文件相关),但是这个问题确实之前没有特别考虑过. ...
- eclipse plugin development -menu
org.eclipse.ui.menus locationURI MenuContribution locationURI = "[Scheme]:[id]?[argument-list]& ...
- 按装 autoconf 出现 需要安装m4-1.4.16.tar.gz的错误
root@suzgc # /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config - ...
- WRI$_ADV_OBJECTS表过大,导致PDB的SYSAUX表空间不足
现象监控发现sysaux表空间使用不断增加,导致表空间不足 查看过程 查看版本: SQL> select * from v$version; BANNER CON_ID ------------ ...
- MySQL 5.6新特性 -- Index Condition Pushdown
Index Condition Pushdown(ICP)是针对mysql使用索引从表中检索行数据时的一种优化方法. 在没有ICP特性之前,存储引擎根据索引去基表查找并将数据返回给mysql se ...
- js数组相关知识集合
一.js数组快速排序 <script type="text/javascript"> var arr = [1, 2, 3, 54, 22, 1, 2, 3]; fun ...
- 【iCore4 双核心板_ARM】例程十一:DMA实验——存储器到存储器的传输
实验原理: DAM(直接存储器访问)传输不需要占用CPU,可以在存储器至存储器实现高速的数据 传输.本实验采用DAM2控制器的数据流0,选用通道0进行数据传输.通过LED的颜色来 判断传输是否成功. ...
- 初识Spring Security
本文参考或者转自:http://haohaoxuexi.iteye.com/blog/2154299 1.新建Spring Security配置文件spring-security.xml:<?x ...
- 【转】xhEditor技术手册 网页编辑器基础教程
1. xhEditor入门基础 1.1. 在线可视化HTML编辑器概述1.2. 获取xhEditor1.3. xhEditor运行环境1.4. xhEditor基本使用指南 1.1. 在线可视化HTM ...
- ORA-00257:archiver error问题处理方法
原文链接:http://www.7747.net/database/201109/104615.html ORA-00257: archiver error. Connect internal onl ...