网站升级到 django4.1.3 后,连接老版本的数据库(mysql5.5)的时候,时不时出现错误:
File "/usr/local/lib/python3.11/site-packages/django/db/backends/base/base.py", line 207, in check_database_version_supported
raise NotSupportedError(
django.db.utils.NotSupportedError: MySQL 5.7 or later is required (found 5.5.53).
解决...
假设是一个model,名为Attach
class Attach(models.Model):
file = FileField(upload_to="files/%Y/%m/%d")
保存上传文件,这个最简单:
def upload(request):
attach = Attach()
attach.file = request.FILES.get('file')
attach.save()
保存网络上采集的文件:
import requests
from django.core.files.base import Cont...
是:
urllib.parse.quote
而不是 urllib.parse.urlencode
标准的方法是:
>>> os.path.splitext('thefile.jpg')[1]
'.jpg'
这样获得的是带点号的后坠,如果不要点号呢?当然可以在结果上继续处理
>>> os.path.splitext('thefile.jpg')[1][1:]
'jpg'
不过有更简便的方法,使用字符串的split方法
>>> 'thefile.jpg'.split('.')[-1]
'jpg'
有强迫症,看见python没有end关键字,就像将倾的大厦,向一边倾斜,缺少对称之美。于是总想着给python加个end。在十几年前听说韩国有程序员给python(整容😁)用注释的方式加end,比如:
if True:
print("hello")
#end
这个思路不错,但是注释前面的#号看着还是不舒服。
又想到用定义一个end变量:
if True:
print("hello")
end = ''
让end等于空字符串,这样前面不用带一个#号了,但后面拖着个小尾巴,还是不舒服。
既然注释和变量都不完美,那么用...
可能是由于内存限制,对大文件只能替换前面的一部分,可以使用re.compile突破这种限制
比如:
re.sub("abc", "123", largeText, re.S|re.I)
可以改成:
match = re.compile("abc", re.S|re.I)
match.sub("123", largeText)
在settings.json加入如下配置:
"python.analysis.indexing": true
在uwsgi.xml加入下面一项
<disable-logging>true</disable-logging>
假设startapp创建的app为app1
在app1中创建一个helpers模块,加入如下代码:
from django.db import models
from django.db.models.signals import pre_delete
from django.dispatch import receiver
def bind_delete_signal(model):
@receiver(pre_delete, sender=model)
def pre_model_delete(sender, **kwargs):...
有时候在使用正则表达式做匹配的时候,我们希望匹配一个字符串,这个字符串的前面或后面需要是特定的内容,但我们又不想要前面或后面的这个特定的内容,(这里的特定内容是指字符串,如果是字符可以用^排除),这时候就需要零宽断言的帮助了。所谓零宽断言,简单来说就是匹配一个位置,这个位置满足某个正则,但是不纳入匹配结果的,所以叫“零宽”,而且这个位置的前面或后面需要满足某种正则。
正预测先行断言
断言自身出现的位置的后面能匹配表达式exp
语法格式
(?=exp)
...
bccn_shell进入docker,按向上键一次就会出现 ./manage.py shell ,如果不出现继续按。出现后按回车进入控制台。
from news.models import Article
for article in Article.objects.filter(public=False).order_by('id')[0:1000]:
article.delete()
一次删1000篇
Django诞生于2003年,到现在16年了,一直在稳妥的推进,没飚版本号,在rails如日中天的时候没借鉴rails,一直坚持自己的风格,向前兼容也做得很好。这点比python好,python从2到3的变动好像失去了方向。
pickle.dumps(unicode_draft) #不建议
pickle.dumps(unicode_draft.encode('utf-8')) #建议
直接pickle.dumps(unicode_draft)的时候,保存的是这种形式:
V<ul>\u5982\u4f55\u89e3\u6790
pickle.dumps(utf8_str_draft)的时候,保存的是这种形式:
S'\xe5\xad\x99\xe9\x91\xa'
一个V,一个S,S后面跟的是单引号包裹的字符串。
-------------------------...
有时候用pip 安装 uwsgi因为各种依赖问题装不上,可以用apt-get来装。
apt-get install uwsgi
apt-get install uwsgi-plugin-python
不过uwsgi.xml需要加一项
<plugins>python</plugins>
当migrations越来越多的时候执行 makemigrations 和 migrate 就会越来越慢,可以考虑对其瘦身(减少migrations文件的数量),有两种方法:
1、squashmigrations(官方推荐)
此方法将一个app中的多个migration文件合并为一个,详见 http://doc.bccnsoft.com/docs/django-docs-1.7-en/topics/migrations.html#squashing-migrations
2、手动删除migrations文件
步骤:
...
今天执行djangod的合并迁移的时候运行了:
./manage.py squashmigrations contenttypes 0002
然后再执行迁移命令就出现错误提示:
django.db.migrations.loader.BadMigrationError: Migration 0001_squashed_0002_remove_content_type_name in app contenttypes has no Migration class
然后删除了网站所有migrations目录下的文件,清空了django_...
网上的一些文章都是介绍只对某个IP显示的,下面的设置是IP无关的(用户账号有关)
1、安装
sudo pip install django-debug-toolbar
2、在 settings.py 的 MIDDLEWARE_CLASSES 项中加入
'debug_toolbar.middleware.DebugToolbarMiddleware',
3、在 settings.py 中加入
def custom_show_toolbar(reques...
rails的binding.pry调试很爽,在刷新网页的时候直接进入代码内部还原现场,直接查看、操作上下文的对象。其实python社区也有相应的实现,以django为例,在代码中插入:
import IPython
IPython.embed()
以如下代码为例:
def lists(request):
text = '哈哈嘻嘻12'
import IPython //插入这两行
IPython.embed() //插入这两行
return render(request, 'question/lists....
以下代码仅作演示:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
browser = webdriver.Firefox()
browser.set_page_load_timeout(20) # 防止页面加载个没完
browser.get('https://www.zhihu.com/')
browser.find_e...
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from pyquery import PyQuery as pq
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.baidu.com/')
html = browser.find_element_by_xpath("//*").get_attribute("outerHTML") # 不要用 browser.page_source,那样得到的页面源码不标...