月度归档: 2019 年 9 月

  • django输出html内容

    django输出html内容

    最近在学习django,于是就用django做了一个简单的网站,用来练手,具体功能就是从网上抓取数据,然后放到我的网站上面,但是遇到一个问题就是django无法输出html格式的内容,只能以字符串的形式输出:

    data = '<h1>hello world</h1>'
    <p>{{ data }}</p>

    我们目的是输出的是:

    hello world

    但是结果输出的是:

    <h1>hello world</h1>

    在网上搜了好久,终于找到解决办法:

    对于单个变量使用django的过滤器,告诉Django这个字符串不用进行HTML转义,方法如下:

    data | safe

    对于一段模板内容可以使用autoescape标签,比如:

    {% autoescape off %}
         {{ data }}
     {% endautoescape %}

    off 的意思是关闭对html的转义,而将off替换成on就表示进行html转义,默认进行html转义

    注意:autoescape 具备继承性的,如果在父模版中定义了,则在子模版对应内容部分也存在此属性

    我们可能会疑问,django为什么要将这些字符转义,而不是按原本html的内容输出呢?
    我们举个例子:
    需要用户输入用户名来注册,这个用户输入了用户名为:

    <script type="text/javascript">alert('hello');</script>

    假设他输入的长度合法,而且django也确实没显式提供什么特殊字符转换方法,那么每次在网页上面显示的时候,岂不是每次都弹出一个窗口,那么不是就很不安全啦。
    为了解决这个问题,django默认将所有特殊的字符都转换成在html上面可以显示的内容,而不再包含转义功能!于是,也就出现了上面我想输出而输出而输出不了html的内容。

  • Kubernetes WEB UI Dashboard 部署 MySQL/Mariadb容器

    Kubernetes WEB UI Dashboard 部署 MySQL/Mariadb容器

    问题描述

    我们在使用Kubernetes的Dashboard部署mysql/mariadb时出现了错误(Docker Desktop for Mac/Windows开启Kubernetes 及安装注意事项):Back-off restarting failed container 错误 。

    这个错误主要是由于MySQL部署时需要设置 MYSQL_ROOT_PASSWORD 参数,但是我们这里不是时没有设置。

    Docker安装Mariadb数据库 设置root密码 图文教程

    解决方案

    在”显示高级选项”里可以找到”环境变量”设置,这里做好配置然后部署即可。

  • Docker Desktop for Mac/Windows开启Kubernetes 及安装注意事项

    Docker Desktop for Mac/Windows开启Kubernetes 及安装注意事项

    老季晚上性质很高,由于之前玩了一段时间的Docker,所以想了解一下Kubernete WEB UI。但是由于国内无法下载到Kubernete的文件,所以即使再Docker Desktop里点了Kubernete也是一直显示”Kubernete is starting”状态。

    解决方案

    注意:Docker Desktop安装的Kubernete版本必须跟下载的git分支版本对应。否则会在 C:\ProgramData\DockerDesktop\service.txt 出现 "Cannot list nodes: Get https://kubernetes.docker.internal:6443/api/v1/nodes: EOF" 错误。

    https://github.com/AliyunContainerService/k8s-for-docker-desktop

    感谢阿里云的大佬,为我们提供了解决方案。

    注意事项

    Choose Kubeconfig File

    在这一步时,由于我们这边是MacOS,点击到选择文件时,根据阿里大佬给的方案使用 Mac: $HOME/.kube/config ,但是MacOS里无法选择到隐藏文件。这里我们给个小方法,使用终端命令行给配置文件加个小链接

    ls -s ~/.kube/config kube.config

    这样选择的时候直接选择到软链接即可。

    kubernetes dashboard 无法登录提示Not enough data to create auth info structure.

    虽然我们上面创建了快捷方式,但是这里并没有设置token,会报错。

    1、生成 token

    kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

    这里就是我们所需要的 token 了

    2、配置kube的config文件

    vi ~/.kube/config

    将刚才生成的token: 放在最后。( token: 后面有个空格 ,不然会报:错误)

        token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJ0dGwtY29udHJvbGxlci10b2tlbi1rdjlqNiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJ0dGwtY29udHJvbGxlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImU5NGZhNzBjLWUyYjMtMTFlOS1hODEwLTAyNTAwMDAwMDAwMSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTp0dGwtY29udHJvbGxlciJ9.q8g6S4OoF9ESJgWIdgjpjUeMc65xAAGZlK1YlpxuFIUwBFsIsc3PyjWf4Zo25iZguQljjZkIvbMfhB0Lv_yi6va2HoTSREk_qTvyvYJ0a5N7-MDrTCvY0S061jI42J9ply0CGFS_ZXcCrJzuUEEPtfpoQmvyrBfgSf65V6MZSmjHjBKSl2Jmkg0gUhtlonKU0tGNwiM6WkeS8K-A9Rw7XG_rRuwUFN4kwrB8fPIy2dmNVbO2ND9B-9B1lCig-Po9auFczDXggRzVeNqBfRBum9hq4CJ7BK-YyWzHXrWPR8nOMC8il37cD7FhQhRrs74-rSg8t6PjWZ0TALNrmwXOdQ

    至此简单的Kubernetes Dashboard安装完成。

    如何查看在Kubernetes是否安装成功?

    可以在终端里查看已部署的容器。

    kubectl get pods
    kubectl get deployments
  • Docker Windows 版本拉取镜像错误 no matching manifest

    Docker Windows 版本拉取镜像错误 no matching manifest

    问题描述

    在 docker 拉取镜像时出现错误

    > docker pull mysql
    Unable to find image ‘mysql:latest’ locally
    latest: Pulling from library/mysql
    C:\Program Files\Docker\Docker\Resources\bin\docker.exe: no matching manifest for windows/amd64 10.0.18362 in the manifest list entries.

    windows 10 x64安装版本需要开启Hyper-V

    Docker镜像拉取错误码:

    docker pull mysql

    Pulling from library/mysql
    no matching manifest for unknown in the manifest list entries

    解决方法:

    experimental 设置为 true 即可.

  • VirtualBox Windows 10 v1903 中无法启动:Call to WHvSetupPartition failed:

    VirtualBox Windows 10 v1903 中无法启动:Call to WHvSetupPartition failed:

    windows Hyper-V启动后不可以兼容Virtualbox和VMware! 两者一起安装后,启动Virtualbox就会蓝屏!!

    那么最近windows10推出一个新功能:sadbox windows10。那么这个windows系统肯定安装在 Hyper-V 咯。所以出现Call to WHvSetupPartition failed:等错误就直接把 Hyper-V 关掉即可!

    方法一( Windows设置–应用和功能–程序和功能–启用或关闭Windows功能 )

    方法二

    当然也可以通过命令行文件来执行(需以管理员身份运行)

    关闭Windows10 Hyper 功能

    bcdedit /set hypervisorlaunchtype off

    打开Windows10 Hyper 功能

    bcdedit /set hypervisorlaunchtype auto
  • django models 在Django queryset如何过滤数据结果?怎么实现不等于?

    django models 在Django queryset如何过滤数据结果?怎么实现不等于?

    在Django的实际项目开发中,我们会使用到 不等于的情况,比如我想查询id!=3的结果,下面直接给出代码实例。

    方法一

    from django.db.models import Q
    Model.objects.filter(~Q(id = 3))

    方法二

    Model.objects.filter(xxxxxxxx).exclude(id=3)
  • -bash: sz: command not found、-bash: rz: command not found

    -bash: sz: command not found、-bash: rz: command not found

    Linux系统中如果没有安装 lrzsz这个包,就会报rz、sz命令找不到,安装即可解决。

    CentOS中解决-bash: sz: command not found、-bash: rz: command not found解决方法:

    yum install lrzsz
  • JQuery 合并 table 相同数据的列 rowspan

    JQuery 合并 table 相同数据的列 rowspan

    在实际项目应用当中,可能需要合并 table 表格中相同数据的列来显示数据,当然也可以再显示数据时使用rowspan属性来实现合并,但是这样比较复杂。这边我们直接给出使用 jQuery 的函数方法:

    jQuery.fn.rowspan = function(colIdx=0) {
        return this.each(function() {
            var that;
            $('tr', this).each(function(row) {
                $('td:eq(' + colIdx + ')', this).filter(':visible').each(function(col) {
                    if (that != null && $(this).html() == $(that).html()) {
                        rowspan = $(that).attr("rowSpan");
                        if (rowspan == undefined) {
                            $(that).attr("rowSpan", 1);
                            rowspan = $(that).attr("rowSpan");
                        }
                        rowspan = Number(rowspan) + 1;
                        $(that).attr("rowSpan", rowspan);
                        $(this).hide();
                    } else {
                        that = this;
                    }
                });
            });
        });
    }
    $(function() {
        //要合并的列序号,后面数字是第几列
        $("#content_table").rowspan(0); 
        $("#content_table").rowspan(1);
    });
  • crontab实现每N秒执行一次

    crontab实现每N秒执行一次

    linux中的crontab 命令,最小的执行时间是一分钟。如需要在小于一分钟内重复执行,可以有两个方法实现。

    Linux命令详解:crontab 定时任务

    直接在crontab -e中。

    * * * * * 执行命令绝对路径  文件绝对路径
    * * * * * sleep 10; 执行命令绝对路径  文件绝对路径
    * * * * * sleep 20; 执行命令绝对路径  文件绝对路径
    * * * * * sleep 30; 执行命令绝对路径  文件绝对路径
    * * * * * sleep 40; 执行命令绝对路径  文件绝对路径
    * * * * * sleep 50; 执行命令绝对路径  文件绝对路径

    上面,是每隔10秒执行一次。

  • Django 后台开发 为某个模型添加额外Javascript引用

    Django 后台开发 为某个模型添加额外Javascript引用

    最近在学Python,正好在一个项目中使用到了Django。网上查了很多资料如何为一个模型额外引用Javascript,基本都说得很简单并没有说到哪个文件哪个位置说的很笼统,对于初学者来说并不是很了解。这里记录一下如何为某个表增删改查时增加额外的 Javascript 。

    在应用的 admin.py 中配置即可,目录结构如上图所示:

    class ComputerRoomAdmin(admin.ModelAdmin):
        list_display = ('id', 'name','type','weights')
        list_display_links = ('id','name')  
        ordering = ('-weights',)
        class Media:
            js = ('/static/computerroom.js',)
    admin.site.register(models.ComputerRoom , ComputerRoomAdmin)

    这里的 js 即为需要使用的 Javascript 。

  • Django css Javascript 静态文件404 解决办法 图文教程

    Django css Javascript 静态文件404 解决办法 图文教程

    问题描述

    按照django的默认配置,django无法直接读取成功静态文件,网站的样式css和js无法成功读取,总是报404错误。Django 后台开发 为某个模型添加额外Javascript引用

    默认静态文件的相关配置为

    settings.py
    import os
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'web',
    ]
    STATIC_URL = '/static/'
    

    最佳解决办法

    这是django中针对windows的静态/媒体/模板访问的工作解决方案

    import os.path
    STATIC_ROOT = ''
    STATIC_URL = '/static/'
    STATICFILES_DIRS = ( os.path.join('static'), )
    

    添加完毕后,可以正常访问静态资源。

    随后删掉添加的内容后依然可以访问静态资源,可能跟windows有关系。

  • Docker 下使用Centos系统镜像安装 uwsgi 运行 Python3 Django Nginx 反向代理

    Docker 下使用Centos系统镜像安装 uwsgi 运行 Python3 Django Nginx 反向代理

    需求描述

    最近老季在用Python3,Django写项目,这边具体记录一下在Docker下如何安装uwsgi来运行Django。

    注意:本项目代码已在宿主中生成过项目及文件,创建项目方法请移步:django入门教程 创建项目(Project)和应用(App)

    宿主Docker命令

    docker run -itd -v D:\wwwroot\:/data/wwwroot -p 8001:9000 --name juwsgi --link jnginx --link jmysql centos /usr/sbin/init

    这里我们只在linux系统中安装了 uwsgi 来运行python的web环境,mysql已单独运行在其他容器中。

    创建映射文件

    d:\wwwroot\traffic_scheduling 中创建 uwsgi.ini 的配置文件

    [uwsgi]
    # Django-related settings 
    # the base directory (full path) 
    chdir = /data/wwwroot/traffic_scheduling/web/
    # Django's wsgi file 
    module = web.wsgi 
    # the virtualenv (full path) 
    # home = /path/to/virtualenv 
    # process-related settings 
    master master = true 
    # maximum number of worker processes 
    processes = 2
    # the socket (use the full path to be safe) 
    # socket = /path/to/your/project/mysite.sock 
    socket = :9000
    # ... with appropriate permissions - may be needed 
    # chmod-socket = 664 
    # clear environment on exit 
    vacuum = true
    buffer-size = 32768
    pidfile = /tmp/uwsgi-IRM.pid   
    daemonize = /tmp/uwsgi-IRM.log
    

    uwsgi中的socket

    uwsgi监听的socket,可以为socket文件

    socket = /www/wwwroot/web/script/uwsgi.sock

    或 ip地址+端口号

    socket = :9000

    用nginx的时候就配socket , 直接运行的时候配 http
    指定IP端口 // 直接外部访问

    http-socket = :9000

    进入容器

    docker exec -it juwsgi /bin/bash

    在容器中运行命令

    1、在Centos容器中运行安装Python3

    CentOS上安装配置Python3.7 编译安装图文教程

    2、在容器中运行pip命令

    pip install --upgrade pip
    pip install django mysqlclient uwsgi
    ln -s /usr/local/bin/uwsgi /usr/bin/uwsgi

    测试你的Django项目

    现在,我们想让uWSGI做同样的事,但是返回一个Django站点而不是 test.py 模块。

    如果你还没有这样做,那么请确保你的 mysite 项目实际上正常工作,在终端中运行如下命令:

    python manage.py runserver 0.0.0.0:9000

    在浏览器中输入 http://127.0.0.1:9000 。

    如果正常,在终端中ctrl + c 取消,然后在终端中进入目录 /data/wwwroot/traffic_scheduling/web/ ,则使用uWSGI来运行它:

    uwsgi --http :9000 --module web.wsgi
    • module web.wsgi: 加载指定的wsgi模块

    将你的浏览器指向该服务器;如果站点出现,那么意味着uWSGI可以为你虚拟环境中的Django应用服务,而这个栈工作正常:

    the web client <-> uWSGI <-> Django
    

    现在,通常我们不会让浏览器直接与uWSGI通信。那是web服务器的工作,这是个穿针引线的活。

    配置Nginx容器

    Docker 安装 Nginx 映射本地文件 多虚拟主机 图文教程

    示例配置文件如下

    # mysite_nginx.conf
    # the upstream component nginx needs to connect to
    upstream django {
        # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
        server 127.0.0.1:9000; # for a web port socket (we'll use this first)
    }
    # configuration of the server
    server {
        # the port your site will be served on
        listen      8001;
        # the domain name it will serve for
        server_name .example.com; # substitute your machine's IP address or FQDN
        charset     utf-8;
        # max upload size
        client_max_body_size 75M;   # adjust to taste
        location /static {
            root /data/wwwroot/traffic_scheduling/web/; # your Django project's static files - amend as required
        }
        # Finally, send all non-media requests to the Django server.
        location / {
            uwsgi_pass  django;
            include     uwsgi_params; # the uwsgi_params file you installed
        }
    }

    Centos下请关闭SELinux,否则会出现 403 forbidden (13: Permission denied) 关闭SELinux的两种方法

    部署静态文件

    在运行nginx之前,你必须收集所有的Django静态文件到静态文件夹里。首先,必须编辑web/settings.py,添加:

    STATIC_ROOT = os.path.join(BASE_DIR, "static")

    然后运行

    python manage.py collectstatic
    

    基本的nginx测试

    重启nginx:

    /etc/init.d/nginx restart

    要检查是否正确的提供了媒体文件服务,添加一个名为 media.png 的图像到 /data/wwwroot/traffic_scheduling/web/static 目录中,然后访问http://example.com:8000/media/media.png – 如果这能正常工作,那么至少你知道nginx正在正确的提供文件服务。

    值得不仅仅是重启nginx,而是实际停止然后再次启动它,这将会通知是否有问题,以及问题在哪里。

    在宿主中查看是否可以成功运行

    在浏览器中输入 http://127.0.0.1:8001 查看是否运行成功。

WeChat