栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

(Django)Web网页导入pycharm时遇到的问题集合(备份)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

后台
  • 入门项目
  • 毕业设计
    • *创建项目过程*
    • *问题*
  • 功能实现
    • *华为身份证识别步骤:*
    • *点击按钮删除条目信息:*
    • *后台添加内容前端显示无法显示换行和空格:*
    • *前端HTML页面判断数据库是否有数据显示不同内容:*
    • *前端HTML页面判断是否为管理员用户:*
    • *分页显示内容:*
    • *如何显示其他第三方平台页面数据(爬虫):*

入门项目
  1. 在js文件中导入img文件无法导入
    写错路径
    例如应该写为:arr[0]="../static/img/character1.png";
  2. 每个页面都要{% load static %},很麻烦
    在setting文件中加入:

‘builtins’:[‘django.templatetags.static’],

位置如下:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'builtins':['django.templatetags.static'],
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

模型建立

  1. TypeError: init() got an unexpected keyword argument ‘min_length’
    不是设置min_length
  2. django.db.utils.OperationalError: (1118, 'Row size too large. The maximum row size for the used table type
    …或者别的错误提示,反正是too large
    错误原因:max_length太过于大了
    去除max_length后会显示ERRORS: booksmodels.Books.one_contain: (fields.E120) CharFields must define a 'max_length' attribute.
    因为对于CharField来说max_length是必填项
    解决方法有两种
    一、改小最大长度
    二、改为TextField,可以不设置最大长度
  3. 修改前端用户密码时候报错:Cannot resolve keyword 'user_id' into field. Choices are: date_joined, email, first_name, groups, id, is_active, is_staff, is_superuser, last_login, last_name, logentry, myuser, password, user_permissions, username
    名字填写没问题
毕业设计 创建项目过程
  1. New Project-Django
    可以选择填写more settings中的templates folder和application name为templates和app,templates中放网页,app中放配置文件,如settings、urls.py…
  2. 新建static文件夹,专门放静态文件,如css、js、img等
  3. 在app-urls.py的urlpatterns = []加入页面路由:如path('', include('index.urls'), name="index"),或者path('about-section/', include('about-section.urls'), name="about-section"),这里的name可以在分别的子app中设置app_name即可绑定
    注:每新建一个文件夹/路由页面都需在settings的INSTALLED_APPS中添加名字,如
    'index',
    'about_section',
    'environmental_protection',
    'memorabilia',

创建文件夹index,新建urls.py文件,添加代码:

from django.urls import path
from index import views
app_name = "index"
urlpatterns = [
    path('', views.index,name='index'),#进入该界面后不输入任何
]

新建views.py文件:

from django.shortcuts import render

def index(request):
    return render(request,'index.html')

现在可以显示首页内容了,但样式等信息没有

  1. 正常显示css/js/img页面:
    在settings文件中台南佳静态文件目录:STATICFILES_DIRS=[os.path.join(BASE_DIR,'static')]
    在html文件中修改获取样式的代码:
    注:如有问题,尝试在html文件最上方加入:{% load static %}
  2. 建立后台:
    草稿纸设计初步用户表:例如:ID 用户名 密码 是否身份识别标识
    在settings.py文件中填写:
DATABASES = {
    'default': {
        # 数据库的类型
        'ENGINE': 'django.db.backends.mysql',
        # 所使用的数据库的名字
        'NAME': 'graduation_project',
        # 数据库服务器的用户
        'USER': 'root',
        # 密码
        'PASSWORD': '1234',
        # 主机
        'HOST': '127.0.0.1',
        # 端口
        'POST': '3306',
    }
}
  1. 在app配置文件-init.py中填写:
    导入安装pymysql
import pymysql
pymysql.install_as_MySQLdb()
  1. 在terminal中输入命令行:python manage.py migrate,迁移数据库
  2. 建立超级用户
    利用命令行:python manage.py createsuperuser
    输入用户名、邮箱、密码,创建成功
  3. 后台显示admin界面自建模型英文改为中文:settings文件:LANGUAGE_CODE = ‘zh-hans’
  4. 设置登录功能模块:
    新建app:my_users(自定义)
    加入.py文件:admin.py、apps.py、models.py
    admin.py
from django.contrib import admin
from .models import MyUser


# Register your models here.
class MyUserAdmin(admin.ModelAdmin):
    list_display = ("id","card_whether")

# admin.site.register(FrontUser)
# Register your models here.
admin.site.register(MyUser, MyUserAdmin)

apps.py

from django.apps import AppConfig


class MyUsersConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'my_users'

models.py

from django.db import models
from django.contrib.auth.models import User


class MyUser(models.Model):
    user_id = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name="用户")
    # name = models.CharField(max_length=20,unique=True, verbose_name="用户名") #verbose_name把后台显示改成中文
    # user_password=models.CharField(max_length=30,verbose_name="用户密码")
    card_whether=models.BooleanField(default=True, verbose_name="身份证验证标识符")

    class Meta:
        verbose_name = "网页登录用户"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.user_id.username

做了以上操作千万不要忘记在settings中的INSTALLED_APPS添加你所新建的文件夹哦!
现在在admin界面就有你所创建的用户类了。

  1. 登录注册form表单修改&创建:
    注:name与相应app中views.py和forms.py中的名字一一对应
    注册:
{% csrf_token %}
×

注册

我有账号,回到登录

登录:

{% csrf_token %}
×

登录

你没有账号? 注册

  1. 完善注册功能:
    在注册页面app中新建文件:apps.py、views.py和forms.py
    apps.py
from django.apps import AppConfig
class RegistrationConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'index'

views.py

from django.shortcuts import render

from django.contrib.auth.hashers import make_password
from django.contrib.auth.models import User
from django.http import HttpResponseRedirect
from django.shortcuts import render, redirect
from index.forms import FormRegistration
from django.contrib import messages

def index(request):
    if request.method == 'GET':
        return render(request, 'index.html')
    if request.method == 'POST':
        form = FormRegistration(request.POST)
        if form.is_valid():
            # 把数据保存到数据库
            # 伪提交
            front_user = form.save(commit=False)
            username = form.cleaned_data.get("username")
            password = form.cleaned_data.get("pw2")
            user = User(username=username, password=make_password(password))
            user.save()
            front_user.user_id = user
            front_user.save()
            messages.success(request, "注册成功!请在点击个人中心进行登录!")
            return HttpResponseRedirect('/')
        else:
            username = form.cleaned_data.get("username")
            password = form.cleaned_data.get("pw2")
            if username is None:
                messages.success(request, "注册失败!用户名为空!")
                return render(request, 'index.html')
            messages.success(request, "注册失败!密码输入错误!")
            print(form.errors.get_json_data())
            return render(request, 'index.html')

forms.py

# 登录页面form文件
from django import forms
from django.http import HttpResponse

from my_users.models import MyUser


class FormRegistration(forms.ModelForm):
    username = forms.CharField(max_length=10, min_length=1)
    pw1 = forms.CharField(max_length=20, min_length=6)
    pw2 = forms.CharField(max_length=20, min_length=6)
    class Meta:
        model = MyUser
        exclude=["user_id"]
    def clean_username(self):
        username=self.cleaned_data.get("username")
        if username=="me":
            raise forms.ValidationError("用户名不能是me!")
        return username

    def clean(self):
        clened_data=super().clean()
        pw1=clened_data.get("pw1")
        pw2=clened_data.get("pw2")
        if pw1!=pw2:
            raise forms.ValidationError("两次密码输入不一致!!")
        return clened_data
  1. 输入命令行的位置:tools-run manage.py Task
    输入命令行:
    python manage.py makemigrations
    python manage.py migrate
    makemigrations
    migrate
  2. 完成以上内容,注册功能完成,在页面输入点击注册,可以在数据库中显示信息!
  3. 退出登录功能:
    url中添加:path('logout/', views.logout, name='index'), # 退出登录
    views文件中:
def logout(request):
    # 实现退出功能
    # 删除session
    if 'username' in request.session:
        del request.session['username']
    resp = HttpResponseRedirect('/')
    # 删除cookie
    if 'username' in request.COOKIES:
        resp.delete_cookie('username')
    auth.logout(request)
    messages.success(request, "已退出登录")
    return resp

绑定html标签:


	

退出登录

  1. 登录注册使用弹框形式,都是post,如何在后台区分:
    html页面给提交按钮button/input添加name:详见问题19
  2. 判断用户登录状态跳转页面:
    settings文件中MIDDLEWARE必须要有:
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',

判断是否登录:
if request.user.is_authenticated():
判断登录进入个人中心页面,未登录提示需要登录:

def personal(request):
    if request.user.is_authenticated():
        return HttpResponseRedirect('/')
    else:
        messages.success(request, "请先进行登录!")
        return HttpResponseRedirect('/')
path('personal/', views.personal, name='index'),
  • 个人中心
    1. 获取登录用户的用户名并显示在HTML页面:

      用户名:{{ request.user }}

    2. 用户登录为AnonymousUser,匿名用户,无法获取用户名:
      在登录视图文件的提示登录成功前一行加一行代码:auth.login(request, user)
    3. 各种html跳转页面方法:
    return render(request, 'index.html')
    return HttpResponseRedirect('/')
    return redirect('/index/')
    return redirect('https://blog.csdn.net/personal_center', context={"my_user_data": data,"card_data": card_data})
    return redirect(reverse('blog:article_list'))
    return render_to_response('index.html')
    return HttpResponse('上传成功!')  直接返回页面,页面内容为上传成功!
    
    1. 退出页面仍然为登录状态,匿名用户登录状态:
      设置匿名用户不能够访问:
      通过 is_anonymous() 或 is_authenticated() 来判别是否为匿名用户
    2. ‘bool’ object is not callable
      原因:使用if request.user.is_authenticated():判断用户是否登录
      解决办法:删除括号(),is_authenticated是属性而不是方法
      所以is_anonymous() 或 is_authenticated()使用一个就可以了
      最终判断用户登录写法:
    def personal(request):
        if request.user.is_authenticated:
            return HttpResponseRedirect('https://blog.csdn.net/personal_center')
        else:
            messages.success(request, "请先进行登录!")
            return HttpResponseRedirect('/')
    
  • 个人中心
  • path('personal/', views.personal, name='index'),
    
    1. 前端判断用户是否登录:
      eg:用户未登录弹出登录对话框,已登录跳转至个人中心页面:
    {% if request.user.is_authenticated %}
    
  • 个人中心
  • {% else %}
  • 个人中心
  • {% endif %}
    问题
    1. OSError: [WinError 123] 文件名、目录名或卷标语法不正确。: ''
      修改了application name的名字需要在settings中也做修改
    2. django.core.exceptions.ImproperlyConfigured: The app label ‘qualification-honor’ is not a valid Python identifier.
      起包名称的时候不要使用“-”中间下划线,可以使用“_”这种下划线(底部下划线)
    3. 无法识别css:
      有可能需要一个斜杠哦!href="/static/css/frame.css"
    4. 批量替换:ctrl+R
    5. django.db.utils.OperationalError: (1045, “Access denied for user ‘root’@‘localhost’ (using password: YES)”)
      数据库密码错误
    6. ModuleNotFoundError: No module named ‘pymysql’
      在cmd中输入pip install PyMySQL
    7. django.db.utils.ProgrammingError: (1146, “Table ‘graduation_project.auth_user’ doesn’t exist”)
      需迁移数据库:python manage.py migrate
    8. 建立模型布尔类型:card_whether=models.BooleanField(default=True, verbose_name="身份证验证标识符")
    9. {‘user’: [{‘message’: ‘这个字段是必填项。’, ‘code’: ‘required’}]}
      改写Meta内容
    10. TypeError: Field ‘id’ expected a number but got .
      模型没建好
    11. python: can’t open file ‘manager.py’: [Errno 2] No such file or directory
      模型没建好
    12. tools中没有run manage.py Task的选项,命令行都需要再此处输入
      app的名字需要和项目名称一样!!!
    13. django.core.exceptions.ImproperlyConfigured: The app module has multiple filesystem locations ([‘D:毕业设计projectgraduation_project_djangoindex’, ‘D:/毕业设计/project/graduation_project_djangoindex’]); you must configure this app with an AppConfig subclass with a ‘path’ class attribute.
      app中添加空白文件:__init__.py,最好所以app都加一个
    14. Unknown command: ‘python’ Type ‘manage.py help’ for usage.
      输入命令有误,如果是在run manage.py Task输入,只需要输入makemigrations、migrates
    15. 禁止访问 (403) CSRF验证失败. 请求被中断.
      1.在模板文件中的form表单内添加 {% csrf_token %}
      2.在模板文件中的form表单内添加 {% csrf_token %}
      3.form表单是否有active:
    16. 如何使用django弹框:
      html:
    {#弹框#}
    {% if messages %}
        
    {% endif %}
    

    views.py文件:

    from django.contrib import messages
    messages.success(request, "注册成功!请在点击个人中心进行登录!")
    

    前提:settings文件中INSTALLED_APPS 含有’django.contrib.messages’,

    1. 判断空字符串: is None
    2. ‘QueryDict’ object has no attribute ‘has_key’
      Python3中取消了has_key方法,改为in即可
      eg:
    # if request.POST.has_key('register'):
    if 'register' in request.POST:
    
    1. 一个html页面有两个form表单,分别为登录注册,分别按钮提交做法:
      html页面给提交按钮button/input添加name:
    
        {% csrf_token %}
        
    ×

    登录

    你没有账号? 注册

    在views.py文件中可以进行分别判断:

    if request.method == 'POST':
        # 登录
        # if request.POST.has_key('login'):
        if 'login' in request.POST:
    

    可能还需要做的一步:
    为按钮添加onclick事件:
    给form表单添加id:


    然后在js文件中写入函数内容:

    //点击提交按钮触发下面的函数
    function submitForm() {
    //第一个表单
        var tform1 = document.getElementById("form1");
    //第二个表单
        var tform2 = document.getElementById("form2");
    //提交第一个表单
        tform1.submit();
    //提交第二个表单
        tform2.submit();
    }
    
    1. 使用alter不显示弹框:
      换个浏览器就好了,IE不支持!!
    2. IE不显示alter,360浏览器却显示,兼容性不高,使IE也显示:
      解决办法:script不使用引入外部文件的方式,直接在底部script或者a标签处添加alter:
    
    

    景区概况

    1. alter修改标题样式:暂未
    2. 刷新页面数据丢失:
      return的路径错误,少写了一个斜杠(“/”)
    3. 前端HTML页面如何判断css的dispaly是none还是block?
      无法判断好像,采用js判断(设置span值)
    var open_text0 = document.getElementsByClassName("open")[0];
    open_text0.innerHTML = "展开";
    
    1. python获取数据库最新三条数据
      重点:
      获取数据库中的多条数据使用XX__in,例如news_data = NewsList.objects.filter(id__in=[a,a-1])
    if NewsList.objects.exists():
        news_data_all = NewsList.objects.all()
        a = 0
        for i in news_data_all:
            print(i.id)
            a = a + 1
        print("a", a)
        if a == 1:
            news_data = NewsList.objects.filter(id=a)
        elif a == 2:
            news_data = NewsList.objects.filter(id__in=[a,a-1])
        else:
            news_data = NewsList.objects.filter(id__in=[a, a - 1, a - 2])
        print(news_data)
    else:
        news_data = "暂无新闻数据"
    return render(request, 'index.html', context={"news_data": news_data})
    
    {% for data in news_data %}
      {{ data.title }}
    {% endfor %}
    
    1. 单独获取时间的时分秒

    {{ data.new_date.year }}

    {{ data.new_date.month }}.{{ data.new_date.day }}
    1. django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.
      我登陆的为管理员用户,逻辑没有错误,之前调用也没有错误,忽然出错,原因:换了接口,换个浏览器没有出错
    功能实现

    身份证实名认证:
    百度接口文档:百度接口文档
    参考实例链接:Python 百度ai身份证接口案例
    在实名认证的app文件中新建一个utils.py文件
    安装baidu-aip模块:cmd-pip3 install baidu-aip
    首先最重要的需要做的事:获取百度AI接口密钥:
    登录百度AI官网:https://ai.baidu.com/tech/ocr

    https://ai.baidu.com/tech/ocr_cards/idcard
    https://console.bce.baidu.com/ai/?fromai=1#/ai/ocr/overview/index
    选择卡证-身份证
    参考链接:(详细过程!!!)Python调用百度AI识别身份证
    报错:
    KeyError: ‘access_token’
    [28/Apr/2022 23:07:18] “GET https://blog.csdn.net/personal_center/ HTTP/1.1” 500 70307
    可能是因为未购买百度接口

    由于百度需要购买所以转用华为:
    参考链接:华为实现:Python实现AI图像识别-身份证识别
    华为云官网:

    https://www.huaweicloud.com/
    https://www.huaweicloud.com/product/cardocr.html

    报错:KeyError: ‘x-subject-token’
    解决办法:先进行认证鉴权
    修改URL:
    查看:华为官网-Python SDK、身份证识别
    重要信息查看:(点击右上角用户名-我的凭证/统一身份认证-用户/项目)

    https://console.huaweicloud.com/iam/?agencyId=82ff12f825164f438cfe6fce088e9829®ion=cn-east-3&locale=zh-cn#/mine/apiCredential
    可以查看IAM用户名、帐号名、IAM用户ID、帐号ID、项目ID、项目名称等等

    华为身份证识别步骤:

    可参考链接:

    https://www.cnblogs.com/blxt/p/15152663.html
    https://www.cnblogs.com/wwwwtt/p/15892599.html
    https://www.yht7.com/news/154842
    

    1、首先注册华为云服务账号,完成开通服务申请和认证鉴权。
    认证鉴权参考链接:https://support.huaweicloud.com/api-ocr/ocr_03_0005.html
    认证鉴权可以先在 调试网站 (PostMan)测试:
    选择post输入url;
    在headers输入Content-Type(key)、application/json(value)
    在body中输入代码:

    {
        "auth": {
            "identity": {
                "methods": [
                    "password"
                ],
                "password": {
                    "user": {
                        "name": "hw098469098",
                        "password": "520.mjw84",
                        "domain": {
                            "name": "hw098469098"
                        }
                    }
                }
            },
            "scope": {
                "project": {
                    "name": "cn-north-4"
                }
            }
        }
    }
    

    输出错误信息:

    {
        "error": {
            "code": 401,
            "message": "The username or password is wrong.",
            "title": "Unauthorized"
        }
    }
    
    我的凭证-IAM用户名姓名IAM用户ID身份证号码
    ----
    账号中心-帐号名(华为帐号信息)租户名(华为云业务信息)
    --
    项目编号项目区域年轻
    3f6f29cec58a4d9cb2048e8d16b0a5c5cn-north-4华北-北京四
    b9419ea91e604b29a30d1a344fc9c070cn-east-3华东-上海一

    解决办法:
    如果华为云帐号已升级为华为帐号,将不支持获取帐号Token。建议创建一个IAM用户,获取IAM用户的Token。方法如下:
    登录-右上角-统一身份认证-创建用户(使用这次创建的IAM用户名和密码就可以运行成功了)
    返回的响应消息头中“x-subject-token”就是需要获取的用户Token。获取Token之后,就可以使用Token认证调用OCR服务API。

    2、获取token,在身份证识别的页面app中创建一个.py文件,编写代码:

    import requests
    
    # 下面url为华为云获取token的接口,这个接口基本一致,需要注意的是“iam.cn-north-4.myhuaweicloud.com”这个需要根据具体需求进行修改,不同区域项目不同
    url = "https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens"
    # 头部信息
    headers = {'Content-Type': 'application/json'}
    # json内容,需要上传进行做验证
    payload = {
        "auth": {
            "identity": {
                "methods": [
                    "password"
                ],
                "password": {
                    "user": {
                        # name值为你的IAM账号名
                        "name": "-",
                        "password": "-",
                        # password值为你的IAM密码
                        "domain": {
                            # name值为你的主账号的账号名
                            "name": "-"
                        }
                    }
                }
            },
            "scope": {
                "project": {
                    # name值为你的项目ID
                    "name": "cn-north-4"
                }
            }
        }
    }
    # 使用POST上传头部内容和body内容
    response = requests.post(url, headers=headers, json=payload)
    # 获取token值
    token = response.headers['X-Subject-Token']
    # 打印token值
    print(token)
    

    报错: AttributeError: module ‘requests’ has no attribute ‘post’
    解决办法: .py文件的名称不要起代码中的参数名称,如requests、token,我改成了getToken就可以运行出结果token了。

    3、调用身份证识别接口
    身份证识别华为参考链接:https://support.huaweicloud.com/api-ocr/ocr_03_0030.html#section4
    新建文件:getIdApi.py

    import requests
    import base64
    from personal_center import getToken
    # url值
    url = "https://ocr.cn-north-4.myhuaweicloud.com/v2/{project_id}/ocr/id-card"
    # 上面获取到的token值
    token = getToken.token
    print(token)
    # 设置头部信息
    headers = {'Content-Type': 'application/json', 'X-Auth-Token': token}
    # 图片路径
    imagepath = r"./static/img/id_card/id_card.jpg"
    # 设置图片
    with open(imagepath, "rb") as bin_data:
         image_data = bin_data.read()
    # 使用图片的base64编码
    image_base64 = base64.b64encode(image_data).decode("utf-8")
    # url与image参数二选一
    payload = {"image": image_base64}
    # 上传参数
    response = requests.post(url, headers=headers, json=payload)
    # 打印识别的信息
    response = response.text
    print(response)
    

    报错: FileNotFoundError: [Errno 2] No such file or directory: ‘./static/img/id_card/id_card.jpg’
    解决办法: 路径修改为imagepath = r"D:毕业设计projectgraduation_project_djangostaticimgid_cardid_card.jpg"
    报错:{“error_code”:“ModelArts.4204”,“error_msg”:“Request api error! The API ec4abf59-2004-4f07-9452-3533ef98fc5a is not subscribed.”}
    解决办法: 未订阅该区域下的内容审核服务(主要是图像内容审核)。
    没有订阅该API,请订阅该API,订阅API请参考服务介绍开通申请服务。如已开通服务,请检查开通服务的区域与服务调用的一致(左上角查看地点),若一致请检查API的URL是否拼写正确,HTTP请求方法(POST,GET等)是否正确。
    点击链接:https://support.huaweicloud.com/moderation/index.html、https://console.huaweicloud.com/moderation/?region=cn-north-4&locale=zh-cn#/moderation/services/management,开通内容审核功能即可,对象存储服务OBS授权也要开通。
    对于图像内容审核开通步骤可参考:https://support.huaweicloud.com/qs-moderation/moderation_07_0002.html
    服务使用步骤:开通服务(用户请在服务列表或服务管理页面选择服务申请开通。)-对象存储服务OBS授权(任选)(如果需要对OBS中的数据进行内容审核,请开通开通对象存储服务OBS授权。)-配置环境(获取SDK和样例工程,导入到开发环境中。)-调用服务(调用API接口过程使用服务,具体接口内容请随时查看API参考,使用中可随时查看状态码与错误码。)
    配置环境:

    • 获取内容审核SDK软件包和文档:cmd-pip install huaweicloudsdkimage,SDK中心:https://sdkcenter.developer.huaweicloud.com/
    • 环境配置,Python开发环境配置:https://support.huaweicloud.com/sdkreference-moderation/moderation_04_0023.html
    • 导入SDK工程:Python语言SDK获取和安装:https://support.huaweicloud.com/sdkreference-moderation/moderation_04_0024.html
    pip 安装:
    # 安装核心库
    pip install huaweicloudsdkcore
    # 安装Moderation服务库
    pip install huaweicloudsdkmoderation
    

    使用pycharm安装,步骤如下:

    • 打开pycharm,点击File -> Settings…。
    • 点击Python Interpreter -> 点击+。
    • 点击+,分别搜索huaweicloudsdkcore及huaweicloudsdkmoderation,搜索到包内容点击左下角Install Package完成安装。

    解决问题中途出现的报错: error occurred when installing package ‘huaweicloudsdkmoderation’.
    ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
    解决办法: 关闭Settings运行一下程序重新打开settings再安装,还是不行就在cmd中先运行pip install huaweicloudsdkmoderation,重启一下pycharm
    继续解决之前的问题:
    大错特错!!是文本内容审核,但是步骤差不多一致,无需修改!!
    文本审核内容步骤链接:https://support.huaweicloud.com/qs-moderation/moderation_07_0001.html
    好像又是图像内容审核…再研究一下吧!!!
    终于发现原因了!!竟然如此简单!
    开通身份证识别服务:https://console.huaweicloud.com/ocr/?region=cn-north-4#/ocr/overview


    计费说明:https://support.huaweicloud.com/productdesc-ocr/ocr_01_0070.html
    代码最后输出结果:

    4、获取其中的某一个值的话需要先转换为字典,通过字典再进行单一读取

    import json
    
    # 转换为字典
    test = json.loads(response)
    # 从字典中获取相应的值
    username = test['result']['name']
    print("username:"+username)
    

    5、前后端连接:
    前端上传图片进行实名认证并显示信息,然后存入数据库后端。
    django实现图片上传和展示:

    • 设置settings.py,配置上传文件路径
    # 配置上传文件路径
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    
    • 建立数据库模型
      外键的建立:
    from my_users.models import MyUser
    
    user_id=models.ForeignKey(MyUser,on_delete=models.CASCADE, verbose_name="用户id")
    
    from django.db import models
    from django.contrib.auth.models import User
    from my_users.models import MyUser
    
    #用ImageField类型需要pip install Pillow
    class idCards(models.Model):
        # CASCADE级联,删除主表数据时连通一起删除外键表中数据
        user_id=models.ForeignKey(MyUser,on_delete=models.CASCADE, verbose_name="用户id")
        img=models.ImageField(upload_to='img/id_card/', verbose_name="身份证图片")
        name = models.CharField(max_length=100, verbose_name="姓名")
        sex = models.CharField(max_length=100, verbose_name="性别")
        ethnicity = models.CharField(max_length=100, verbose_name="民族")
        birth = models.CharField(max_length=100, verbose_name="出生日期")
        address = models.CharField(max_length=100, verbose_name="住址")
        number = models.CharField(max_length=100, verbose_name="身份证号")
        class Meta:
            verbose_name = "实名认证信息"
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return self.name
    

    报错: ERRORS:
    personal_center.Books.img: (fields.E210) Cannot use ImageField because Pillow is not installed.
    HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command “python -m pip install Pillow”.
    解决办法: pycharm—file—settings—Project Interpreter—点击加号—安装pillow

    • 点开tools—run manage.py task运行makemigrations+appname、migrate+appname进行迁移数据库
      报错: 创建了数据库在数据库中显示,但是django后台admin却不显示
      解决办法: 没有创建admin.py文件
      报错: 在admin页面数据库上传了图片之后,无法点击查看图片详情
      解决办法: 主url.py添加代码如下:
    from django.conf.urls.static import static
    from django.conf import settings
    urlpatterns = [
        path('admin/', admin.site.urls),
        ......
    ]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    
    • 编写上传图片前端代码文件:
      html文件:

    美化css文件:

    .box {
        width: 460px;
        max-height: 290px;
        margin: 0 auto;
    }
    
    .box li {
        list-style: none;
    }
    
    .imgFileUploade {
        width: 100%;
        padding: 10px;
    }
    
    .imgFileUploade .pic-header {
        height: 50px;
        width: 100%;
        line-height: 50px;
    }
    
    .imgFileUploade .pic-header span {
        display: block;
        float: left;
    }
    
    .imgFileUploade .pic-header span.imgTitle {
        line-height: 50px;
    }
    
    .imgFileUploade .pic-header span.imgTitle b {
        color: red;
        margin: 0 5px;
        line-height: 57px;
        display: block;
        float: right;
        font-size: 20px;
    }
    
    .imgFileUploade .pic-header span.imgClick {
        width: 50px;
        height: 50px;
        background: url(../img/comment1.png) no-repeat center center;
        background-size: cover;
    }
    
    .imgFileUploade .pic-header span.imgcontent {
        color: #999;
        margin-left: 10px;
        line-height: 50px;
    }
    
    .imgFileUploade .imgAll {
        width: 100%;
        margin-top: 5px;
    }
    
    .imgFileUploade .imgAll ul:after {
        visibility: hidden;
        display: block;
        font-size: 0;
        content: ".";
        clear: both;
        height: 0
    }
    
    .imgFileUploade .imgAll li {
        width: 290px;
        height: 200px;
        border: solid 1px #ccc;
        margin: 0 auto;
        position: relative;
        box-shadow: 0 0 10px #eee;
    }
    
    .imgFileUploade .imgAll li img {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        display: block;
    }
    
    .delImg {
        position: absolute;
        top: -10px;
        right: -7px;
        width: 22px;
        height: 22px;
        background: #000;
        border-radius: 50%;
        display: block;
        text-align: center;
        line-height: 22px;
        color: #fff;
        font-weight: 700;
        font-style: normal;
        cursor: pointer;
    }
    
    .box {
        border: solid 1px #ccc;
    }
    

    js文件代码:两个js文件代码

    • 编写上传图片后端代码文件:
      我想让选择图片上传先进行识别信息,如果识别通过再将数据存入数据库,这里需要用到django的缓存图片。
      参考链接:Python tempfile模块:生成临时文件和临时目录
      参考链接:

    https://www.cnblogs.com/dbf-/p/11383758.html
    https://www.pythonheidong.com/blog/article/659075/ba5bdf1a879bad9dfdfa/
    https://www.pythonheidong.com/blog/article/808826/b3300f899c587858f7f4/
    https://docs.djangoproject.com/en/3.2/topics/http/file-uploads/
    https://docs.python.org/3/library/tempfile.html#tempfile.NamedTemporaryFile
    https://cloud.tencent.com/developer/ask/sof/603837
    https://blog.csdn.net/qq_44979825/article/details/109966159

    发现我不是很能使用这种方法…并且方向不对…
    js文件中选择图片有一个imgSrc的参数,尝试使用!
    具体位置如下:

    var ImgFileupload = function (b, imgName, imgSrc, imgSize, callback) {
            this.b = b;
            this.imgName = imgName;
            this.imgSize = imgSize;
            this.imgSrc = imgSrc;
            this.callback = callback;
            alert(imgSrc)
        };
    

    可以发现在选择图片以后会有路径!
    Python调用js函数:
    参考链接:

    https://jingyan.baidu.com/article/a3aad71aa1c9e7f0fa009660.html
    https://www.jb51.net/article/209279.htm#_label6(和上条链接相同)
    https://blog.csdn.net/wxf_csdn/article/details/107064242

    安装PyExecJS第三方库(File | Settings | Project: graduation_project_dj… | Project Interpreter)
    调用方法:

    1.引入模块的库名:import execjs
    2.引入需要被调用的js文件:建议放置于python文件的同级目录。
    3.Python调用过程:
    (1)打开并读取js文件(注意编码格式)
    rFile = open("./static/js/test.js", 'r', encoding='UTF-8')
    
    (2)通过execjs库加载并编译js文件
    testResult = execjs.compile(rFile.read()).call('test')
    
    (3)方法解说
    eval()
    输入参数:source(JS语句)、cwd(路径)
    返回值:result(语句执行结果)
    compile()
    输入参数:source(JS语句)、cwd(路径)
    返回值:编译后的对象
    call()
    输入参数:name(要调用的JS方法名称)、*args(方法所需要的参数,可多个)
    返回值:result(运行方法的返回结果)
    

    报错: UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xa0 in position 541: illegal multibyte sequence
    解决办法: 将imgSrc = execjs.compile(open("./static/js/imgFileupload.js").read().decode("utf-8")).call('ImgFileupload', 'imgSrc')改为:

    rFile = open("./static/js/imgFileupload.js", 'r', encoding='UTF-8')
    imgSrc = execjs.compile(rFile.read()).call('ImgFileupload', 'imgSrc')
    

    报错: execjs._exceptions.ProgramError: TypeError: ‘window’ 未定义
    解决办法: 在js文件开头加上:window=this;
    报错: execjs._exceptions.ProgramError: SyntaxError: 语法错误
    解决办法: 语法有问题
    报错: execjs._exceptions.ProgramError: TypeError: ‘imgSrc’ 未定义
    解决办法: 修改获取方法
    改为:

    # 编译加载js字符串
     context1 = execjs.compile(js_from_file('./static/js/imgFileupload.js'))
     print(context1)
     # 调用js代码中的imgSrc_src方法,参数为imgSrc
     # 方法名:imgSrc_src
     # 参数:imgSrc
     print(context1.eval('imgSrc'))
     result1 = context1.call("ImgFileupload", "imgSrc")
     print("result1"+result1)
    

    未解决
    重新梳理思路:
    先识别图片,将图片再创建一个模型,只存放当前需要识别的图片,并且重命名为同一个名字,用后删除,每次识别路径相同。
    然后再提交识别信息及其识别图片,然后删除图片模型内的图片。
    给上传的图片进行重命名:
    参考链接:

    https://blog.csdn.net/z564359805/article/details/90578351
    

    报错: AttributeError: ‘false_idCards’ object has no attribute ‘is_valid’
    解决办法: 没有form.py文件或者内容有误,删除.is_valid()
    如果身份标识符为0则显示上传图片部分,为1则显示图片:(card_whether 为布尔类型)

    {% if request.user.card_whether %}
        

    (Django)Web网页导入pycharm时遇到的问题集合(备份)
    {% else %}

    {# #}
    {% endif %}

    报错:

    • 这个字段是必填项。

    之后在同目录下就会出现一个txt文件,其中有需要的信息
    另外的重点:
    以上获取地址的方法仅仅适用于在第三步自己的数据处于HTML页面中,我的数据进行了加密无法在HTML页面中获取,则需要修改:
    我需要获得的是JSON中的数据:

    import requests  # 引用requests库
    
    # 爬虫头数据
    headers = {
        'Connection': 'keep-alive',
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
        'Origin': 'http://36.189.242.44:2081',
        'Referer': 'http://36.189.242.44:2081/slmhlt-shop/view/shop-list.html?channelCode=jd&name=%E9%85%92%E5%BA%97',
        'Accept-Language': 'zh-CN,zh;q=0.9',
    }
    
    params = {
        'lang': 'cn',
        'sysCode': 'sub7415641',
        'pageSize': '9',
        'pageNum': '1',
        'priceSort': '',
        'sightCrowd': '',
        'productCategoryName': '酒店',
    }
    # 获取网页
    response = requests.get('http://api.pc.jkxds.net/pc/1.0/product/productList', params=params, headers=headers,verify=False)
    # 调用get方法,下载这个字典
    json = response.json()
    print(json)
    # 使用json()方法,将response对象,转为列表/字典
    list = json['data']['list']
    # 一层一层地取字典,获取列表数据
    for i in list:
        # list是一个列表,i是它里面的元素
        print(i['productId'])
        # 以name为键,查找酒店名称
        print('酒店名称:' + i['productName'])
        # 查找酒店价格
        print('酒店价格:' + str(i['sellPrice']) + '元')
        # 查找酒店图片
        print('酒店图片:' + i['thumbImageUrl'])
        # 查找酒店购票二维码
    

    接下来只需要和views文件结合在一起就可以显示在前端页面了,list 已经是字典了,所以在views文件获取(hotel_list=reptile.list,reptile是上述代码的文件)到list就可以在前端页面for循环获取显示了。
    问题:
    解决办法: 右键网络中我们需要的那个数据,清除浏览器缓存和cookie,刷新页面解决
    问题: 列表中的字典,列表字典嵌套使用,向列表中添加字典
    解决办法: 参考链接:https://www.jb51.net/article/216216.htm#_label6、https://wenku.baidu.com/view/0079c71640323968011ca300a6c30c225901f0e7.html

    1. 爬虫的图片不显示
      经过对比发现网页中的图片src为"http://image.jkxds.net/images/product/20190806/34037f31-b60f-4814-a522-79b7b09c72f6.jpg",爬虫下来的信息为/images/product/20190806/34037f31-b60f-4814-a522-79b7b09c72f6.jpg,所以可以在前端HTML调用的时候修改{ data.thumbImageUrl }}" alt="{{ data.productName }}">就可以正常显示了
    2. 爬取script中的文字/图片方法:使用正则表达式
      参考链接:
    https://wenku.baidu.com/view/96300ae50ba1284ac850ad02de80d4d8d05a015b.html
    https://wenku.baidu.com/view/804de7f530d4b14e852458fb770bf78a65293abd.html
    

    我所爬虫的网页图片信息不是图片而是为网格涂色…我以为在script才有了这条,最终解决办法,截图保存在本地static静态文件中,命名XX1、2、3,然后为爬虫的字典list添加index字段,从1-3,然后在前端页面获取,具体操作如下:
    { data.index }}.png">

    # 设置index为1、2、3,来获取本地图片路径
    index=1
    for i in list:
        i["index"]=index
        index=index+1
    print(list)
    
    1. 不想要爬虫的所有数据,想要其中的三条数据
      知识点:python添加dict、json内容
      思路:获取其中想要的一条数据,在该数据后增添其他想要的数据
    sptTitleList2={}
    sptTitleList2[0]=sptTitleList[2]
    sptTitleList2[1]=sptTitleList[3]
    sptTitleList2[2]=sptTitleList[4]
    print(sptTitleList2)
    

    问题: views文件中调用爬虫数据提示错误TypeError: 'int' object is not subscriptable
    解决办法: 这是因为给本来就是下角标又添加的下角标,我的代码需要把print(data['sptTitle'])、print(data[0])改为print(ticket_list[data]['sptTitle'])
    问题: 前端获取views文件的数据使用{{ ticket_list.data.sptTitle }}无法获取,但是{{ ticket_list.0.sptTitle }}却可以获取,data本身就是012
    解决办法: 上述代码使用的是{}字典,改为[],使用append添加数据,就不会有下标了,代码如下:

    sptTitleList2=[]
    sptTitleList2.append(sptTitleList[2])
    sptTitleList2.append(sptTitleList[3])
    sptTitleList2.append(sptTitleList[4])
    print(sptTitleList2)
    

    这个时候在前端获取就可以用如下方式:

    views.py:
    ticket_list = reptile_ticket.sptTitleList2
    for data in ticket_list:
        print(data['sptTitle'])
    return render(request, 'scenic_spot_guide5.html', context={"comment_data": comment_obj,"ticket_list": ticket_list})
    HTML页面:
    {% for data in ticket_list %}
        {{ data.sptTitle }}
    {% endfor %}
    

    问题: AttributeError: ‘NoneType’ object has no attribute ‘append’
    解决办法: 将sptTitleList2=sptTitleList2.append(sptTitleList[4])改为sptTitleList2.append(sptTitleList[4])
    问题: TypeError: list indices must be integers or slices, not str
    解决办法: 将print(data['productList']['reservePurchase'])改为print(data['productList'][0]['reservePurchase']),前端代码也进行修改显示:{ data.productList.0.productName }}">{{ data.productList.0.productName }}
    问题: 前端页面判断为空字符串
    解决办法: 在javascript中设置判断,在html页面也可以判断,HTML页面判断如下:

    {% if data.productList.0.passAddress.value == null %}
        暂无
    {% else %}
        {{ data.productList.0.passAddress }}
    {% endif %}
    
    转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/878916.html
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号