IT记录

日常学习、工作的点滴记录


  • 首页

  • categories

  • archive

  • tags

  • 搜索

Python实现Splash API 调用

发表于 2021-10-09   |   分类于 Python   |   暂无评论

render.html

import requests
url = 'http://localhost:8050/render.html?url=https://www.baidu.com'
response = requests.get(url)
print(response.text)

## render.png

import requests

url = 'http://localhost:8050/render.png?url=https://www.jd.com&wait=5&width=1000&height=700'
response = requests.get(url)
with open('taobao.png', 'wb') as f:
    f.write(response.content)

Requests 请求报错 [SSL: SSL_NEGATIVE_LENGTH] dh key too small

发表于 2021-10-09   |   分类于 Python   |   暂无评论

requests 模块请求提示以下错误:
在Python3.4版本下代码可以正常运行,更高级版本会报错!

urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='www.XXXX.com', port=XXX): Max retries exceeded with url: XXXX (Caused by SSLError(SSLError(1, '[SSL: SSL_NEGATIVE_LENGTH] dh key too small (_ssl.c:777)'),))

'''
解决办法如下:

import requests
import urllib3

requests.packages.urllib3.disable_warnings()
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += 'HIGH:!DH:!aNULL'
try:
    requests.packages.urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST += 'HIGH:!DH:!aNULL'
except AttributeError:
    # no pyopenssl support used / needed / available
    pass

page = requests.get(url, verify=False)

MongoDB 批量添加记录中不存在的字段(待测试)

发表于 2021-10-09   |   分类于 数据库   |   暂无评论

MongoDB是基于分布式文件存储的数据库,与关系型数据库不同,记录中的字段数量可以各不相同。本文将介绍如何对MongoDB记录中不存在的字段进行批量添加并赋值。

MongoDB update方法

update() 方法用于更新已存在的文档,语法如下:

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

参数说明:
query: update的查询条件,类似sql update查询内where后面的。
update: update的对象和一些更新的操作符,也可以理解为sql update查询内set后面的。
upsert: 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew, true为插入,默认是false,不插入。
multi: 可选,mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,则更新所有按条件查出来的多条记录。
writeConcern: 可选,抛出异常的级别。

实例,批量添加记录中不存在的字段

创建测试数据库

use testdb
db.createUser(  
    {  
        "user":"root",  
        "pwd":"123456",  
        "roles":[{"role" : "readWrite", "db":"testdb"}]  
    }  
) 
db.auth(  
    {  
        "user":"root",  
        "pwd":"123456"  
    }  
) 

插入测试数据,部分有is_auth,is_admin

db.member.insert([
    {
        "id" : 1,
        "name" : "fdipzone",
        "is_auth" : 1,
        "is_admin" : 1
    },
    {
        "id" : 2,
        "name" : "tom",
        "is_admin" : 1
    },
    {
        "id" : 3,
        "name" : "polly"
    },
    {
        "id" : 4,
        "name" : "anslem"
    },
    {
        "id" : 5,
        "name" : "terry",
        "is_auth" : 1
    }
])

查询插入记录

db.member.find();
{ "_id" : ObjectId("58eb8f83e352c5ee4b6db93a"), "id" : 1, "name" : "fdipzone", "is_auth" : 1, "is_admin" : 1 }
{ "_id" : ObjectId("58eb8f83e352c5ee4b6db93b"), "id" : 2, "name" : "tom", "is_admin" : 1 }
{ "_id" : ObjectId("58eb8f83e352c5ee4b6db93c"), "id" : 3, "name" : "polly" }
{ "_id" : ObjectId("58eb8f83e352c5ee4b6db93d"), "id" : 4, "name" : "anslem" }
{ "_id" : ObjectId("58eb8f83e352c5ee4b6db93e"), "id" : 5, "name" : "terry", "is_auth" : 1 }

对于不存在is_auth, is_admin字段的记录,批量插入is_auth, is_admin字段,值为0。

批量插入is_auth:0

db.member.update(
    {"is_auth" : {$exists : false}},
    {"$set" : {"is_auth" : 0}},
    false,
    true
)

批量插入is_admin:0

db.member.update(
    {"is_admin" : {$exists : false}},
    {"$set" : {"is_admin" : 0}},
    false,
    true
)

插入后查询,全部记录都已经含有is_auth, is_admin字段

Django3.0应用03:设置首页

发表于 2021-10-09   |   分类于 Django   |   暂无评论

设置模板及静态网页css等目录

在根目录下新建模板目录templates

并在其中按照Bootstrap教程中的内容,新建index.html文件;

修改setting.py文件中的templates部分中路径部分

'DIRS': [os.path.join(BASE_DIR, 'templates')],

新建静态文件夹static

并在其中新建css,img,images,js,media等文件夹。
修改setting.py文件中的static等路径部分

STATIC_URL = '/static/'
STATIC_ROOT = 'static/'
#STATICFILES_DIRS = [os.path.join(BASE_DIR, "static"),]
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

配置前端静态页面的URL

打开项目urls.py文件,修改为如下代码:

from django.urls import path, include, re_path
from django.views.static import serve
from gaokao.settings import MEDIA_ROOT,STATIC_ROOT
import xadmin

urlpatterns = [
    path('',include('college.urls')),
    path('xadmin/',xadmin.site.urls ),
    re_path('media/(?P<path>.*)', serve, {"document_root": MEDIA_ROOT}),
    re_path('static/(?P<path>.*)', serve, {"document_root": STATIC_ROOT}),
]

这样就使用college的url设置为网页路径设置。

新建首页

新建base.html,导入Bootstrap

    <!doctype html>
    <html lang="en">
    {% load static %}
      <head>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    
        <!-- Bootstrap CSS -->
       
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootswatch/4.5.2/simplex/bootstrap.min.css" integrity="sha384-FYrl2Nk72fpV6+l3Bymt1zZhnQFK75ipDqPXK0sOR0f/zeOSZ45/tKlsKucQyjSp" crossorigin="anonymous">
    
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.4.1/dist/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
        <title>{% block title%} 高考信息 - 首页{% endblock %}</title>
      </head>
<body>
        <div class="container">        
            <nav class="navbar navbar-expand-lg navbar-light bg-light">
                <a class="navbar-brand" href="/">高考信息</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarColor03" aria-controls="navbarColor03" aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>

                <div class="collapse navbar-collapse" id="navbarColor03">
                    <ul class="navbar-nav mr-auto">
                        <li class="nav-item active">
                            <a class="nav-link" href="/">首页 <span class="sr-only">(current)</span></a>
                        </li>                    
                    </ul>
                    <form class="form-inline my-2 my-lg-0">
                        <input class="form-control mr-sm-2" type="text" placeholder="Search">
                        <button class="btn btn-secondary my-2 my-sm-0" type="submit">Search</button>
                    </form>
                </div>
            </nav>
        
            <div></div><br>
       
            <div class="row">
                <div class="col-8" >
                    {% block content %}{% endblock %}
                </div>
                <div class="col-4">
                    {% block left %}{% endblock %}
                </div>

            </div>
           
        </div><!-- /.container -->

        <!-- Optional JavaScript -->
        <!-- jQuery first, then Popper.js, then Bootstrap JS -->
         </body>
</html>

django3.0后使用{% load static %},而不是原先{% load staticfiles %}

设置college的urls.py

from django.urls import path, include, re_path
from django.views.static import serve
from gaokao.settings import MEDIA_ROOT,STATIC_ROOT
from college.views import IndexView, CollegeDetailView


urlpatterns = [
    path('',IndexView.as_view(), name="index"), 
    re_path('college_detail/(?P<college_code>.*)/', CollegeDetailView.as_view(), name="college_detail"),    
]

设置college的views.py

from django.shortcuts import render
from django.views.generic import View,DetailView
from .models import College
from django.core.paginator import Paginator
# Create your views here.
class IndexView(View):
    def get(self, request):
        # 取出文章分类
        colleges = College.objects.all()[:10]
        return render(request, "index.html", {
           "colleges":colleges,
          
            
        })

class CollegeDetailView(DetailView):
    def get(self, request, college_code):
        college = College.objects.get(code = college_code)

        return render(request, "college-detail.html", {
            "college": college,
           
        })

修改index.html文件

{% extends 'base.html' %}
{% block title %}首页 - 高考信息{% endblock %}
{% block content %}
        <div>
            <div>
                <h3><a href="#">大学</a></h3> 
            </div>           
            <div> 
                {% for college in colleges %}  
                        <div><a href="{% url 'college_detail' college.code %}" target="_blank">{{ college.name }}</a></div>  
                {% endfor %} 
            </div>  
        </div>
       
{% endblock %}

{% block left %}
    <div class="card">        
        
    </div> 
    <div class="card">        
        
    </div>       
{% endblock %}

Django3.0应用02:用户UserProfile设置

发表于 2021-10-09   |   分类于 Django   |   暂无评论

新建users App

python manage.py startapp users

将users加入到settings.py中,并添加

AUTH_USER_MODEL='users.UserProfile'

新建users的model

修改models.py,新增用户UserProfile,继承自AbstractUser,

from django.contrib.auth.models import AbstractUser
class UserProfile(AbstractUser):
    birday=models.DateTimeField(verbose_name='生日',null=True,blank=True)
    gender=models.CharField(max_length=6, choices=(('male','男'),('female','女')),default='female',verbose_name='性别')
    address=models.CharField(max_length=100,default='', verbose_name='地址')
    mobile=models.CharField(max_length=11,null=True,blank=True, verbose_name='手机号')
    image=models.ImageField(upload_to='image/%Y/%m',default='image/default.png',max_length=100,verbose_name='图片')
    class Meta:
        verbose_name= '用户信息'
        verbose_name_plural=verbose_name
    
    def __str__(self):
        return self.username

删除数据库除了auth_user外的所有表。然后重新migrate,生成新的数据表。
如果此前已经创建过管理员,需要为userprofile重新设置

python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser

配置静态文件夹

修改settings.py文件,设定静态文件夹

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static"),]
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

修改urls.py文件,使图片文件能访问和显示。

from django.urls import path, include, re_path
from django.views.static import serve
import xadmin
from mycrm.settings import MEDIA_ROOT

urlpatterns = [
    path('xadmin/',xadmin.site.urls ),
    re_path('media/(?P<path>.*)', serve, {"document_root": MEDIA_ROOT}),
]

新增邮箱验证码的设计

修改models.py,

class EmailVerifyRecord(models.Model):
    code = models.CharField(max_length=20, verbose_name="验证码")
    email = models.EmailField(max_length=50, verbose_name="邮箱")
    send_type = models.CharField(verbose_name="验证码类型", choices=(('register', '注册'), ('forget', '找回密码'), ('update_email', '修改邮箱')), max_length=30)
    send_time = models.DateTimeField(verbose_name="发送时间", default=datetime.now)   

    class Meta:
        verbose_name = "邮箱验证码"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.email

在user中新建一个名为adminx.py的文件,将EmailVerifyRecord注册进我们的admin中,并为它选择管理器EmailVerifyRecordAdmin

import xadmin
from users.models import EmailVerifyRecord

class EmailVerifyRecordAdmin(object):
    list_display = ['code', 'email', 'send_type', 'send_time']  # 一次显示你想出现的多行数据
    search_fields = ['code', 'email', 'send_type']  # 查询你想要的数据
    list_filter = ['code', 'email', 'send_type', 'send_time']  # 过滤器
    model_icon = 'fa fa-user'

xadmin.site.register(EmailVerifyRecord, EmailVerifyRecordAdmin)
注销后,重新登录,邮箱注册码注册成功。
1...151617181920212223

一个高端大气上档次的网站

115 文章
5 分类
51 标签
GitHub 知乎 V2EX SF
© 2026 IT记录
Typecho
主题 - NexT.Pisces