Als ich heute Daten für das Frontend vorbereitete, musste ich das Datenformat in das JSON-Format konvertieren. Ehrlich gesagt ist es manchmal wirklich eine Nervensäge, es sei denn, man hat gute Kenntnisse Es ist wirklich schwer, die Codierungsregeln von Python zu verarbeiten.
Die gesamte Logik
Was wir verarbeiten müssen, ist, einige Artikel zu verarbeiten, mehrere HTML-Dateien zu generieren und dann JSON zu verwenden, um die Liste der Artikel anzuzeigen , Bilder, Abstract und Titel.
Idee
Für die zukünftige Datenerweiterung muss eine Datenbank vorhanden sein. Meine Idee ist, selbst eine einfache Webseite als Einreichungseingabe zu schreiben und diese dann zu veröffentlichen Schreiben Sie nach der Eingabe in die Datenbank eine Seite, um den Artikel anzuzeigen. Nachdem der Anzeigeeffekt korrekt ist, schreiben Sie eine Anforderung, um alle Daten dynamisch nach unten zu crawlen und nacheinander HTML-Dokumente zu generieren. Ich muss nur die endgültigen JSON-Daten aus der Datenbank extrahieren und generieren.
Front-End
Tatsächlich ist das Front-End-Zeug sehr einfach. Ich habe in letzter Zeit Webseiten geschrieben, sodass das Front-End-Zeug erledigt werden kann in Minuten. Der Code lautet wie folgt:
urls.py from django.conf.urls import url, include from . import views urlpatterns = { url(r'^$', views.index, name='index'), url(r'add_article/', views.add_article, name='add_article'), url(r'^article/(?P<main_id>\S+)/$', views.article, name='article'), } views.py # coding=utf-8 from django.shortcuts import render from .models import Tzxy # Create your views here. def index(request): return render(request, 'index.html') def add_article(request): error = 'error' if request.method == 'POST': # 获取前段request的内容 main_id = request.POST['main_id'] img_url = request.POST['img_url'] title = request.POST['title'] content = request.POST['content'] abstract = content[:50] print main_id indb = Tzxy( main_id=main_id, img_url=img_url, title=title, content=content, abstract=abstract ) indb.save() error = 'success' return render(request, 'index.html', {'error': error}) return render(request, 'index.html') def article(request, main_id): article_detial = Tzxy.objects.get(main_id=main_id) return render(request, 'views.html', {'content': article_detial}) models.py from __future__ import unicode_literals from django.db import models from django.contrib import admin class Tzxy(models.Model): main_id = models.CharField(max_length=10) img_url = models.CharField(max_length=50, null=True) title = models.CharField(max_length=50) content = models.TextField() abstract = models.CharField(max_length=200) admin.site.register(Tzxy)
Die Vorlage, die ich gerade geschrieben habe, ist ein einfaches Formular
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet"> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> <script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></script> </head> <body> <form method="post" action="/tzxy/add_article/"> {% csrf_token %} main_id: <input type="text" name="main_id"><br> img_url: <input type="text" name="img_url"><br> title: <input type="text" name="title"><br> {% if error == 'success' %} <p class="alert alert-success">{{ error }}</p> {% endif %} <textarea name="content" rows="25" style="width: 600px;"></textarea><br> <input type="submit" name="Submit"> </form> </body> </html>
Angezeigte Seite
{% load custom_markdown %} <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no" /> <meta name="apple-touch-fullscreen" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="format-detection" content="telephone=no"> <meta http-equiv="Cache-Control" content="no-store" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="0" /> <title>{{ content.title }}</title> <link rel="stylesheet" href="../../css/cssreset.min.css"> <link rel="stylesheet" href="../../css/fx_tzxy_content.min.css"> </head> <body> <p class="page"> <h1>{{ content.title }}</h1> <p class="content"> {{ content.content | custom_markdown | linebreaksbr }} </p> </p> </body> </html>
Natürlich habe ich Markdown verwendet, um einige Daten zu verarbeiten. Für die Markdown-Integration können Sie zu „Django Development Blog (6) – Markdown-Unterstützung hinzufügen“ gehen.
Das kleine Skript zum Crawlen von Daten lautet wie folgt. Sie müssen das Anforderungsmodul verwenden
# coding=utf-8 import sys import requests reload(sys) sys.setdefaultencoding('utf8') def tohtml(file_name, startpos, endpos): """ 请求网页数据后把网页源码存储为html格式,启动脚本时要先启动Django的Server :param file_name:生成文件名的前缀,最后一位用传入的数字来代替 :param startpos:开始的数字 :param endpos:结束的数字 :return:None """ for x in range(startpos, endpos): r = requests.get('http://127.0.0.1:8000/tzxy/article/' + file_name + str(x)) with open('/Users/SvenWeng/Desktop/test/' + file_name + str(x) + '.html', 'w') as f: f.write(r.text) print 'success' if __name__ == '__main__': tzhtl_name = 'tzxy_tzhtl_h_' djjyy_name = 'tzxy_djjyy_h_' tohtml(djjyy_name, 1, 39)
Einige der darin enthaltenen Namen können nach Bedarf geändert werden.
JSON generieren
Um ehrlich zu sein, ist die Verwendung von JSON sehr einfach, und Pythons Unterstützung für JSON ist auch sehr gut, aber Wenn es um Chinesisch geht, ist es etwas nervig, mein Code sieht so aus:
# coding=utf-8 import sqlite3 import json import sys reload(sys) sys.setdefaultencoding('utf8') list_json = [] conn = sqlite3.connect('db.sqlite3') c = conn.cursor() sql = 'select * from Tzxy_tzxy' c.execute(sql) all_thing = c.fetchall() for x in all_thing: dic_member = {'id': x[1].split('_')[3], 'img': x[2], 'title': x[3], 'abstract': ''} list_json.append(dic_member) conn.close() final_json = json.dumps(list_json, sort_keys=True, indent=4) with open('test.json', 'w') as f: f.write(final_json)
Die Codelogik lautet: Definieren Sie eine leere Liste, um das Generierte zu speichern Wörterbuchinformationen. Dann holen Sie sich alle zuvor gespeicherten Daten aus SQLite. Führen Sie eine Schleife aus den Daten durch, um ein Wörterbuch im gewünschten Format zu erstellen, und fügen Sie es einzeln in die Liste ein. Verwenden Sie dann die von Python bereitgestellte Methode json.dumps, um die Daten in das JSON-Format zu konvertieren, und schreiben Sie sie dann in die Datei.
Die Logik scheint kein Problem zu haben und die Implementierung ist perfekt, aber als ich am Ende die JSON-Datei zur Überprüfung öffnete, stellte ich fest, dass alle chinesischen Zeichen zu Unicode geworden waren. Das ist einfach ein Betrug.
Nach einer groben Suche scheint es, dass der im Internet erwähnte Inhalt nicht detailliert ist und die angegebenen Beispiele alle sehr, sehr einfach sind. Sie werden direkt an Chinesen weitergegeben, was nicht das ist, was ich finde Ja, am Ende musste ich in den sauren Apfel beißen und die offiziellen Anweisungen lesen und habe schließlich so etwas gefunden: ensure_ascii=False Verwenden Sie diese Methode, wenn Sie Python in Json konvertieren,
final_json = json.dumps(list_json, sort_keys=True, indent=4, ensure_ascii=False)
Nach der Verarbeitung auf diese Weise ist die geschriebene Datei normales Chinesisch.
Die oben beschriebene Methode zum Lesen und Schreiben von JSON in Python mit Chinesisch ist der gesamte vom Herausgeber geteilte Inhalt. Ich hoffe, dass er Ihnen eine Referenz geben kann, und ich hoffe, dass Sie die chinesische PHP-Website unterstützen.
Weitere Artikel zum Lesen und Schreiben von Json in Python mit chinesischen Verarbeitungsmethoden finden Sie auf der chinesischen PHP-Website!